プロジェクトのすべての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;
}
UIImageのカテゴリを使用できます。これは、クラスをサブクラス化する別の方法であり、わずかな変更でも簡単な場合があります。
たとえば、角の丸い属性が設定されたUIImageを返すメソッドを追加します。
+(UIImage *)imageWithContentsOfFile:(NSString *)file cornerRadius:(NSInteger)...
objective-cカテゴリの詳細については、こちらをご覧ください http://macdevelopertips.com/objective-c/objective-c-categories.html
これを確認してください- IImageの丸い角
レイヤーの変更が最善の方法のようです。
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];
サブクラス化するのではなく、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のカテゴリメソッドが呼び出されます。
+ (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
にコードを挿入できません。つまり、マスクレイヤーが正しくない可能性があります。実際、セルを構成するとき、カテゴリメソッドを呼び出しても画像ビューの境界は設定されません。したがって、角丸を追加する前に、画像ビューの境界が設定されていることを確認する必要があります(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に設定するだけです。
はい、UIImageViewをサブクラス化し、プロジェクト全体でカスタムサブクラスを使用する必要があります。
UIImageViewをサブクラス化してから、そのsetNeedsDisplayメソッドを実装すると、サブクラスで丸い角が機能します。 (QuartzCoreをインポートすることを忘れないでください)
-(void)setNeedsDisplay {
self.layer.cornerRadius = 5;
self.layer.masksToBounds = YES;
[self.layer setBorderColor:[[UIColor whiteColor] CGColor]];
[self.layer setBorderWidth: 2.0];
}
これを試して、
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];
これはあなたを助けるかもしれません。