Замість того щоб підкласувати, ви можете досягти більш потужних функціональних можливостей за допомогою простих категорій на UIImageView та CALayer.
Створіть категорію на UIImageView так:
- (void)maskRoundCorners:(UIRectCorner)corners radius:(CGFloat)radius {
if ( corners == UIRectCornerAllCorners ) {
self.layer.cornerRadius = radius;
self.layer.masksToBounds = YES;
} else {
self.layer.mask = [CALayer maskLayerWithCorners:corners radii:CGSizeMake(radius, radius) frame:self.bounds];
}
}
Це викликає метод категорії на CALayer:
+ (id)maskLayerWithCorners:(UIRectCorner)corners radii:(CGSize)radii frame:(CGRect)frame {
CAShapeLayer *mask = [CAShapeLayer layer];
mask.frame = frame;
mask.path = [UIBezierPath bezierPathWithRoundedRect:mask.bounds byRoundingCorners:corners cornerRadii:radii].CGPath;
mask.fillColor = [UIColor whiteColor].CGColor;
return mask;
}
Отже, це дозволяє округлити будь-яку комбінацію (див. UIRectCorner
) Кутів, що особливо зручно, якщо ви хочете розмістити зображення в стилі групи UITableView
. Однак це робить одне застереження. Оскільки ми не підкласифікувались UIImageView
, ми не можемо ввести будь-який код layoutSubviews
, а це означає, що шар маски може бути неправильним. Насправді, під час налаштування комірок межі подання зображення навіть не встановлюються, коли ви викликаєте метод категорії. Отже, перед додаванням закруглених кутів вам потрібно переконатися, що межі подання зображення встановлені (крім випадків, коли використовуєтьсяUIRectCornersAllCorners
).
Ось код, який робить це:
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.