2010-11-30 7 views
94

Je suis un peu perdu. J'ai utilisé la propriété layer de UIView pour arrondir les coins de plusieurs éléments dans mon application. Cependant, celui-ci UIImageView n'est tout simplement pas conforme. Je ne sais pas ce que je manque.Réglage du rayon de coin sur UIImageView ne fonctionne pas

La UIImageView (appelée previewImage) est contenue dans une cellule de vue de table. J'ai essayé de définir l'emplacement multiple de la propriété cornerRadius (dans la cellule elle-même et dans le contrôleur qui crée la cellule) en vain.

static NSString *CellIdentifier = @"MyTableViewCell"; 

MyTableViewCell *cell = (MyTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 
    NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:CellIdentifier owner:self options:nil]; 
    cell = [topLevelObjects objectAtIndex:0]; 
    cell.previewImage.layer.cornerRadius = 20; //Made it 20 to make sure it's obvious. 
} 

Y a-t-il quelque chose à propos du chargement des cellules qui me manque?

Répondre

317

Vous devez définir la propriété masksToBounds à YES de la couche:

cell.previewImage.layer.masksToBounds = YES;

En effet, le contrôle UIImageView crée un pseudo-sous-vue de tenir l'objet UIImage.

+12

Prenez garde cette sera un énorme succès de performance – jjxtra

+5

Pourquoi est-ce un coup de performance? – Michael

+0

@PsychoDad Pourquoi? –

11

Je crois que vous devez définir:

cell.previewImage.layer.masksToBounds = YES; 
cell.previewImage.layer.opaque = NO; 
18

Cela devrait fonctionner

cell.previewImage.clipsToBounds = YES; 

cell.previewImage.layer.cornerRadius = 20; 
+2

Vous ne savez pas si 'clipsToBounds' est une méthode de la classe suivante. Croyez que c'est 'masksToBounds' comme ci-dessus. –

+3

couches @AlfieHanssen ont masksToBounds :, vues ont clipsToBounds: – Kevin

3

Dans Xcode Interface Builder, en sélectionnant l'attribut Dessin 'clip subviews de la vue ainsi que la mise en rayon de coin le code cell.previewImage.layer.cornerRadius = 20; fait le travail pour moi!

See 'Clip Subviews' option in IB

2

Essayez ceci ci-dessous morceau de code

cell.previewImage.layer.cornerRadius = 20; 
cell.previewImage.clipsToBounds = YES; 
6

A noter également que

  1. Si vous utilisez aspectFit ET cornerRadius avec clipsToBounds/masksToBounds, vous ne serez pas la coins arrondis.

i.e. si vous avez cette

theImageView.contentMode = .scaleAspectFit 

et

theImageView.layer.cornerRadius = (theImageView.frame.size.height)/2 
    theImageView.clipsToBounds = true 

ou

theImageView.layer.masksToBounds = true 

Il ne fonctionnera pas. vous devrez vous débarasser du code aspectFit

//theImageView.contentMode = .scaleAspectFit 
  1. Assurez-vous que la largeur et la hauteur de la vue de l'image est même
+0

Ce peut-être corriger – onmyway133

+0

Sur le putain de point! –

+0

2 heures dans les égouts, bonne prise :) – alasker

0
-(void) viewDidAppear:(BOOL)animated{ 
     [super viewDidAppear:animated]; 
     [self setMaskTo:viewDistance 
      byRoundingCorners:UIRectCornerBottomLeft | UIRectCornerBottomRight]; 
      } 

- (void)setMaskTo:(UIView*)view byRoundingCorners:(UIRectCorner)corners 
    { 
     UIBezierPath *rounded = [UIBezierPath 
       bezierPathWithRoundedRect:view.bounds 
               byRoundingCorners:corners 

        cornerRadii:CGSizeMake(20.0, 20.0)]; 

      CAShapeLayer *shape = [[CAShapeLayer alloc] init]; 
      shape.frame = self.view.bounds; 
     [shape setPath:rounded.CGPath]; 
      view.layer.mask = shape; 
     } 
Questions connexes