サブクラス化するのではなく、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に設定するだけです。