Ich möchte allen UIImageViews in meinem Projekt abgerundete Ecken hinzufügen. Ich habe den Code bereits zum Laufen gebracht, muss ihn aber auf jedes Bild anwenden. sollte ich UIImageView unterordnen, um dies hinzuzufügen? Wenn ja, kann mir jemand Hinweise geben, wie das geht?
Hier ist der Code
- (void)viewDidLoad {
[super viewDidLoad];
NSString *mainpath = [[NSBundle mainBundle] bundlePath];
welcomeImageView.image = [UIImage imageWithContentsOfFile:[mainpath stringByAppendingString:@"/test.png"]];
welcomeImageView.layer.cornerRadius = 9.0;
welcomeImageView.layer.masksToBounds = YES;
welcomeImageView.layer.borderColor = [UIColor blackColor].CGColor;
welcomeImageView.layer.borderWidth = 3.0;
CGRect frame = welcomeImageView.frame;
frame.size.width = 100;
frame.size.height = 100;
welcomeImageView.frame = frame;
}
Sie können für UIImage eine Kategorie verwenden, die eine alternative Methode zum Unterklassen einer Klasse darstellt und manchmal nur für kleine Änderungen einfacher ist.
fügen Sie beispielsweise eine Methode hinzu, die ein UIImage mit den festgelegten Attributen für abgerundete Ecken zurückgibt.
+(UIImage *)imageWithContentsOfFile:(NSString *)file cornerRadius:(NSInteger)...
weitere Informationen zu Objective-c-Kategorien finden Sie http://macdevelopertips.com/objective-c/objective-c-categories.html
Überprüfe dies - Abgerundete Ecken auf UIImage
Die Ebenenmodifikation scheint der beste Weg zu sein.
UIImageView * roundedView = [[UIImageView alloc] initWithImage: [UIImage imageNamed:@"wood.jpg"]];
// Get the Layer of any view
CALayer * l = [roundedView layer];
[l setMasksToBounds:YES];
[l setCornerRadius:10.0];
Anstatt Unterklassen zu bilden, können Sie durch einfache Kategorien in UIImageView und CALayer eine leistungsfähigere Funktionalität erzielen.
Erstellen Sie eine Kategorie in UIImageView wie folgt:
- (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];
}
}
Dies ruft eine Kategoriemethode auf CALayer auf:
+ (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;
}
Auf diese Weise können Sie eine beliebige Kombination (siehe UIRectCorner
) von Ecken abrunden. Dies ist besonders praktisch, wenn Sie ein Bild in einen Gruppenstil UITableView
einfügen möchten. Hierbei gibt es jedoch eine Einschränkung. Da wir UIImageView
nicht unterklassifiziert haben, können wir in layoutSubviews
keinen Code einfügen, 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 von UIRectCornersAllCorners
).
Hier ist ein Code, der dies tut:
// 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];
}
Ich habe eine andere Kategorie, die abgerundete Ecken entfernt - alles, was Sie tun müssen, ist alle Masken zu entfernen und cornerRadius
auf 0 zu setzen.
Ja, Sie sollten UIImageView unterordnen und Ihre benutzerdefinierte Unterklasse für das gesamte Projekt verwenden.
Sie können UIImageView in Unterklassen unterteilen. Wenn Sie dann die Methode setNeedsDisplay implementieren, funktionieren die runden Ecken in Unterklassen. (Vergiss nicht, QuartzCore zu importieren)
-(void)setNeedsDisplay {
self.layer.cornerRadius = 5;
self.layer.masksToBounds = YES;
[self.layer setBorderColor:[[UIColor whiteColor] CGColor]];
[self.layer setBorderWidth: 2.0];
}
Versuche dies,
coverImage.image = [UIImage imageWithContentsOfFile:@"coverImage.png"];
coverImage.layer.masksToBounds = YES;
coverImage.layer.cornerRadius = 10.0;
coverImage.layer.borderWidth = 1.0;
coverImage.layer.borderColor = [[UIColor brown] CGColor];
das kann dir helfen.