您可以通过 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
。但是,这样做有一个警告。因为我们没有子类化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。