Anstatt Unterklassen zu erstellen, können Sie durch einfache Kategorien in UIImageView und CALayer leistungsfähigere Funktionen erzielen.
Erstellen Sie eine Kategorie in UIImageView wie folgt:
- (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];
}
}
Dies ruft eine Kategoriemethode in CALayer auf:
+ (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;
}
Auf diese Weise können Sie eine beliebige Kombination UIRectCorner
von Ecken abrunden (siehe ). Dies ist besonders praktisch, wenn Sie ein Bild in einem Gruppenstil platzieren möchten UITableView
. Es gibt jedoch eine Einschränkung, wenn Sie dies tun. Da wir keine Unterklassen haben UIImageView
, können wir keinen Code einfügen layoutSubviews
, was bedeutet, dass die Maskenebene möglicherweise nicht korrekt ist. Tatsächlich werden beim Konfigurieren von Zellen die Grenzen der Bildansicht nicht einmal festgelegt, wenn Sie die Kategoriemethode aufrufen. Daher müssen Sie sicherstellen, dass die Grenzen der Bildansicht festgelegt sind, bevor Sie abgerundete Ecken hinzufügen (außer bei Verwendung UIRectCornersAllCorners
).
Hier ist ein Code, der dies tut:
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];
}
Ich habe eine andere Kategorie, die abgerundete Ecken entfernt - alles, was Sie tun müssen, ist, alle Masken zu entfernen und die cornerRadius
auf 0 zu setzen.