it-swarm.com.de

Fügen Sie allen UIImageViews abgerundete Ecken hinzu

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;
}
78
Jack

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

25
Martinj

Ü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];
114
NP Compete

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.

16
Daniel Thorpe

Ja, Sie sollten UIImageView unterordnen und Ihre benutzerdefinierte Unterklasse für das gesamte Projekt verwenden.

5
Ben Gottlieb

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];
}
4
Alexey Linkov

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.

3
Nithinbemitk