78

プロジェクト内のすべてのUIImageViewに丸みを帯びた角を追加したいと思います。私はすでにコードを機能させていますが、それをすべての画像に適用する必要があります。これを追加するには、UIImageViewをサブクラス化する必要がありますか?もしそうなら、誰かが私にこれを行う方法についていくつかの指針を与えることができますか?

これがコードです

- (void)viewDidLoad {
    [super viewDidLoad];
    NSString *mainpath = [[NSBundle mainBundle] bundlePath];
    welcomeImageView.image = [UIImage imageWithContentsOfFile:[mainpath stringByAppendingString:@"/test.png"]];
    welcomeImageView.layer.cornerRadius = 9.0;
    welcomeImageView.layer.masksToBounds = YES;
    welcomeImageView.layer.borderColor = [UIColor blackColor].CGColor;
    welcomeImageView.layer.borderWidth = 3.0;
    CGRect frame = welcomeImageView.frame;
    frame.size.width = 100;
    frame.size.height = 100;
    welcomeImageView.frame = frame;
}
4

6 に答える 6

114

これを確認してください -UIImageの角が丸い

レイヤーの変更が最善の方法のようです。

UIImageView * roundedView = [[UIImageView alloc] initWithImage: [UIImage imageNamed:@"wood.jpg"]];
// Get the Layer of any view
CALayer * l = [roundedView layer];
[l setMasksToBounds:YES];
[l setCornerRadius:10.0];
于 2010-01-31T12:29:40.123 に答える
25

UIImageのカテゴリを使用できます。これは、クラスをサブクラス化するための代替方法であり、小さな変更だけでも簡単な場合があります。

たとえば、角の丸い属性が設定されたUIImageを返すメソッドを追加します。

+(UIImage *)imageWithContentsOfFile:(NSString *)file cornerRadius:(NSInteger)... 

Objective-cカテゴリの詳細については、http://macdevelopertips.com/objective-c/objective-c-categories.htmlを参照してください。

于 2010-01-31T11:50:31.333 に答える
16

サブクラス化するのではなく、UIImageViewとCALayerの単純なカテゴリを通じて、より強力な機能を実現できます。

次のようにUIImageViewにカテゴリを作成します。

- (void)maskRoundCorners:(UIRectCorner)corners radius:(CGFloat)radius {
    // To round all corners, we can just set the radius on the layer
    if ( corners == UIRectCornerAllCorners ) {
        self.layer.cornerRadius = radius;
        self.layer.masksToBounds = YES;
    } else {
        // If we want to choose which corners we want to mask then
        // it is necessary to create a mask layer.
        self.layer.mask = [CALayer maskLayerWithCorners:corners radii:CGSizeMake(radius, radius) frame:self.bounds];
    }
}

これにより、CALayerでcategoryメソッドが呼び出されます。

+ (id)maskLayerWithCorners:(UIRectCorner)corners radii:(CGSize)radii frame:(CGRect)frame {

    // Create a CAShapeLayer
    CAShapeLayer *mask = [CAShapeLayer layer];

    // Set the frame
    mask.frame = frame;

    // Set the CGPath from a UIBezierPath
    mask.path = [UIBezierPath bezierPathWithRoundedRect:mask.bounds byRoundingCorners:corners cornerRadii:radii].CGPath;

    // Set the fill color
    mask.fillColor = [UIColor whiteColor].CGColor;

    return mask;
}

したがって、これにより、コーナーの任意の組み合わせ(を参照)を丸めることができます。UIRectCornerこれは、画像をグループスタイルで配置する場合に特に便利ですUITableView。ただし、これを行う際の注意点が1つあります。サブクラス化されていないためUIImageView、にコードを挿入できませんlayoutSubviews。これは、マスクレイヤーが正しくない可能性があることを意味します。実際、セルを構成する場合、categoryメソッドを呼び出しても画像ビューの境界は設定されません。したがって、丸みを帯びた角を追加する前に、画像ビューの境界が設定されていることを確認する必要があります(を使用する場合を除くUIRectCornersAllCorners)。

これを行うコードは次のとおりです。

        // Perform corner rounding
        UIRectCorner corners = !UIRectCornerAllCorners;
        if (indexPath.row == 0) 
            corners = UIRectCornerTopLeft;
        if (indexPath.row == numberOfRowsInTheTable)  
            corners |= UIRectCornerBottomLeft;

        if (corners > 0) {
            cell.imageView.bounds = CGRectMake(0.f, 0.f, [self.tableView rowHeight], [self.tableView rowHeight]);
            [cell.imageView maskRoundCorners:corners radius:10.f];
        } else {
            [cell.imageView removeRoundCornersMask];
        }

丸みを帯びた角を削除する別のカテゴリがあります。マスクを削除しcornerRadiusて0に設定するだけです。

于 2012-05-09T11:53:17.837 に答える
5

はい、UIImageViewをサブクラス化し、プロジェクト全体でカスタムサブクラスを使用する必要があります。

于 2010-01-31T11:46:13.283 に答える
4

UIImageViewをサブクラス化してから、そのsetNeedsDisplayメソッドを実装すると、丸い角がサブクラスで機能します。(QuartzCoreをインポートすることを忘れないでください)

-(void)setNeedsDisplay {
    self.layer.cornerRadius = 5;
    self.layer.masksToBounds = YES;
    [self.layer setBorderColor:[[UIColor whiteColor] CGColor]];
    [self.layer setBorderWidth: 2.0];
}
于 2012-05-23T13:26:59.450 に答える
3

これを試して、

coverImage.image = [UIImage imageWithContentsOfFile:@"coverImage.png"]; 
coverImage.layer.masksToBounds = YES;
coverImage.layer.cornerRadius = 10.0;
coverImage.layer.borderWidth = 1.0;
coverImage.layer.borderColor = [[UIColor brown] CGColor];

これはあなたを助けるかもしれません。

于 2013-01-16T11:13:42.337 に答える