web-dev-qa-db-fra.com

Ajouter des coins arrondis à tous les UIImageViews

Je voudrais ajouter des coins arrondis à tous les UIImageViews de mon projet. J'ai déjà fait fonctionner le code, mais je dois l'appliquer à chaque image; dois-je sous-classer UIImageView pour ajouter ceci? Si oui, quelqu'un peut-il me donner des conseils sur la façon de procéder?

Voici le 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

Vous pouvez utiliser une catégorie pour UIImage qui est un autre moyen de sous-classer une classe et parfois plus facile pour de petits changements.

par exemple, ajoutez une méthode qui renvoie un UIImage avec les attributs des coins arrondis définis.

+(UIImage *)imageWithContentsOfFile:(NSString *)file cornerRadius:(NSInteger)... 

plus d'informations sur les catégories Objective-c peuvent être trouvées http://macdevelopertips.com/objective-c/objective-c-categories.html

25
Martinj

Cochez ceci - coins arrondis sur UIImage

La modification de la couche semble être le meilleur moyen.

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

Plutôt que de sous-classer, vous pouvez obtenir des fonctionnalités plus puissantes grâce à des catégories simples sur UIImageView et CALayer.

Créez 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 méthode de catégorie 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 d'arrondir n'importe quelle combinaison (voir UIRectCorner) de coins, ce qui est particulièrement pratique si vous souhaitez mettre une image dans un style de groupe UITableView. Il y a cependant une mise en garde lors de cette opération. Comme nous n'avons pas sous-classé UIImageView, nous ne pouvons pas injecter de code dans layoutSubviews, ce qui signifie que la couche de masque peut ne pas être correcte. En fait, lors de la configuration des cellules, les limites de la vue d'image ne seront même pas définies lorsque vous appelez la méthode category. Par conséquent, vous devez vous assurer que les limites de la vue d'image sont définies avant d'ajouter des coins arrondis (sauf si vous utilisez UIRectCornersAllCorners).

Voici un 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 ne fait que supprimer les masques et définir le cornerRadius sur 0.

16
Daniel Thorpe

Oui, vous devez sous-classer UIImageView et utiliser votre sous-classe personnalisée tout au long de votre projet.

5
Ben Gottlieb

Vous pouvez sous-classer UIImageView puis si vous implémentez sa méthode setNeedsDisplay les coins arrondis fonctionneront sur les sous-classes. (n'oubliez pas d'importer QuartzCore)

-(void)setNeedsDisplay {
    self.layer.cornerRadius = 5;
    self.layer.masksToBounds = YES;
    [self.layer setBorderColor:[[UIColor whiteColor] CGColor]];
    [self.layer setBorderWidth: 2.0];
}
4
Alexey Linkov

Essaye ça,

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];

cela peut vous aider.

3
Nithinbemitk