En lugar de subclasificar, puede lograr una funcionalidad más poderosa a través de categorías simples en UIImageView y CALayer.
Cree una categoría en UIImageView como esta:
- (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];
}
}
Esto llama a un método de categoría en 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;
}
Entonces, esto le permite redondear cualquier combinación (ver UIRectCorner
) de esquinas, lo cual es especialmente útil si desea colocar una imagen en un estilo de grupo UITableView
. Sin embargo, hay una advertencia al hacer esto. Debido a que no hemos subclasificado UIImageView
, no podemos inyectar ningún código layoutSubviews
, lo que significa que la capa de máscara puede no ser correcta. De hecho, al configurar celdas, los límites de la vista de imagen ni siquiera se establecerán cuando llame al método de categoría. Por lo tanto, debe asegurarse de que los límites de la vista de imagen estén establecidos antes de agregar esquinas redondeadas (excepto si se usa UIRectCornersAllCorners
).
Aquí hay un código que hace esto:
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];
}
Tengo otra categoría que elimina las esquinas redondeadas; todo lo que hace es eliminar las máscaras y establecer el valor cornerRadius
en 0.