Plutôt que de sous-classement, vous pouvez obtenir des fonctionnalités plus puissantes grâce à de simples catégories sur UIImageView et CALayer.
Créer une catégorie sur UIImageView comme ceci:
- (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];
}
}
Cela appelle une catégorie de méthode sur 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;
}
Ainsi, cela vous permet de ronde n'importe quelle combinaison (voir UIRectCorner
) des coins, ce qui est particulièrement pratique si vous voulez mettre une image dans un style de groupe UITableView
. Il y a une mise en garde lorsque vous faites cela, cependant. Parce que nous n'avons pas sous-classé UIImageView
, on ne peut pas injecter le code dans layoutSubviews
, ce qui signifie que la couche de masque peut ne pas être correcte. En fait, lors de la configuration de cellules, les limites de l'affichage de l'image même ne pas être en jeu lorsque vous appelez la méthode catégorie. Par conséquent, vous devez vous assurer que les limites de l'affichage de l'image est définie avant d'ajouter des coins arrondis (sauf si vous utilisez UIRectCornersAllCorners
).
Voici un bout de code qui fait cela:
// 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];
}
J'ai une autre catégorie qui supprime les coins arrondis - tout ce qui n'est de supprimer tous les masques et définir l' cornerRadius
à 0.