Вместо создания подклассов вы можете получить более мощную функциональность с помощью простых категорий в 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
, что означает, что слой маски может быть неправильным. На самом деле, при настройке ячеек границы представления изображения даже не устанавливаются при вызове метода категории. Следовательно, перед добавлением закругленных углов необходимо убедиться, что границы вида изображения установлены (кроме случаев использования 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.