78 votes

Ajouter des coins arrondis à tous UIImageViews

Je voudrais ajouter quelques coins arrondis à l’ensemble de la UIImageViews dans mon projet. J’ai ont déjà obtenu le code fonctionne, mais je rencontre à appliquer à chaque image ; Je devrais sous-classe UIImageView d’ajouter ceci ? Si oui, quelqu'un peut me donner quelques conseils sur la façon de le faire ?

Voici le code

114voto

NP Compete Points 1821

Vérifier - Coins arrondis sur UIImage

La modification de la couche semble être la meilleure façon.

25voto

Martinj Points 388

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

par exemple ajouter une méthode qui retourne une UIImage avec le jeu d’attributs de coins arrondis.

plus d’informations sur les catégories de l’Objective-c peut être trouvé http://macdevelopertips.com/objective-c/objective-c-categories.html

16voto

Daniel Thorpe Points 2413

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

Créer 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 catégorie de méthode 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 de ronde n'importe quelle combinaison (voir UIRectCorner) des coins, ce qui est particulièrement pratique si vous voulez mettre une image dans un style de groupe UITableView. Il y a une mise en garde lorsque vous faites cela, cependant. Parce que nous n'avons pas sous-classé UIImageView, on ne peut pas injecter le code dans layoutSubviews, ce qui signifie que la couche de masque peut ne pas être correcte. En fait, lors de la configuration de cellules, les limites de l'affichage de l'image même ne pas être en jeu lorsque vous appelez la méthode catégorie. Par conséquent, vous devez vous assurer que les limites de l'affichage de l'image est définie avant d'ajouter des coins arrondis (sauf si vous utilisez UIRectCornersAllCorners).

Voici un bout de 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 n'est de supprimer tous les masques et définir l' cornerRadius à 0.

5voto

Ben Gottlieb Points 59900

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

4voto

Alexey Linkov Points 77

Vous pouvez créer une sous-classe UIImageView et puis si vous implémentez la méthode setNeedsDisplay les coins ronds fonctionnera sur les sous-classes. (n’oubliez pas d’importer QuartzCore)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X