Ich möchte allen UIImageViews in meinem Projekt einige 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;
}
Antworten:
Sie können eine Kategorie für UIImage verwenden, die eine alternative Methode zum Unterklassen einer Klasse darstellt und manchmal für nur kleine Änderungen einfacher ist.
Fügen Sie beispielsweise eine Methode hinzu, die ein UIImage mit festgelegten Attributen für abgerundete Ecken zurückgibt.
+(UIImage *)imageWithContentsOfFile:(NSString *)file cornerRadius:(NSInteger)...
Weitere Informationen zu Objective-c-Kategorien finden Sie unter http://macdevelopertips.com/objective-c/objective-c-categories.html
quelle
Überprüfen Sie 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];
quelle
UIImageView
Instanz anzuwenden .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 { // 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 in 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
UIRectCorner
von Ecken abrunden (siehe ). Dies ist besonders praktisch, wenn Sie ein Bild in einem Gruppenstil platzieren möchtenUITableView
. Es gibt jedoch eine Einschränkung, wenn Sie dies tun. Da wir keine Unterklassen habenUIImageView
, können wir keinen Code einfügenlayoutSubviews
, 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 VerwendungUIRectCornersAllCorners
).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 die
cornerRadius
auf 0 zu setzen.quelle
Ja, Sie sollten UIImageView unterklassifizieren und Ihre benutzerdefinierte Unterklasse im gesamten Projekt verwenden.
quelle
Sie können UIImageView in Unterklassen unterteilen. Wenn Sie dann die setNeedsDisplay- Methode implementieren, funktionieren die runden Ecken in Unterklassen. (Vergessen Sie 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]; }
quelle
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.
quelle
UIImageView
(dies wird im Code-Snippet der Frage erfolgreich durchgeführt), sondern darum, wie dieser Code effektiv wiederverwendet werden kann.