2010-11-30 6 views
94

Ich bin etwas verloren. Ich habe die Layer-Eigenschaft von UIView verwendet, um die Ecken mehrerer Elemente in meiner App zu runden. Dieses eine UIImageView entspricht jedoch einfach nicht. Nicht sicher, was ich vermisse.Einstellung des Eckenradius auf UIImageView funktioniert nicht

Das UIImageView (namens previewImage) ist in einer Tabellenansichtszelle enthalten. Ich habe versucht, den Standort der cornerRadius-Eigenschaft (in der Zelle selbst und in dem Controller, der die Zelle erstellt) ohne Erfolg zu setzen.

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. 
} 

Gibt es etwas über die Art, wie Zellen geladen werden, die ich vermisse?

Antwort

317

Sie müssen die masksToBounds Eigenschaft auf YES der Ebene setzen:

cell.previewImage.layer.masksToBounds = YES;

Dies liegt daran, die UIImageView Steuerung eine pseudo-subview schafft die UIImage Objekt hält.

+12

diese Vorsicht wird ein großer Leistungshit sein – jjxtra

+5

Warum ist es ein Leistungshit? – Michael

+0

@PsychoDad Warum? –

11

Ich glaube, Sie setzen müssen:

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

Diese

funktionieren sollte
cell.previewImage.clipsToBounds = YES; 

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

Nicht sicher, dass 'clipsToBounds' eine Methode für die spätere Klasse ist. Glauben Sie, es ist 'masksToBounds' wie oben. –

+3

@ AlfieHanssen Ebenen haben masksToBounds :, Ansichten haben ClipsZurBindungen: – Kevin

3

In Xcode Interface Builder 'Clip Subviews' Drawing Attribut für die Ansicht zusammen mit Einstellung der Eckenradius der Auswahl in Der Code cell.previewImage.layer.cornerRadius = 20; erledigt den Job für mich!

See 'Clip Subviews' option in IB

2

Versuchen Sie dies unten Stück Code

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

auch erwähnenswert, dass

  1. Wenn Sie aspectFit UND corner mit clipsToBounds/masksToBounds verwenden, werden Sie nicht das bekommen abgerundete Ecken.

das heißt, wenn Sie diesen

theImageView.contentMode = .scaleAspectFit 

und

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

oder

theImageView.layer.masksToBounds = true 

Es haben wird nicht funktionieren. Sie werden aspectFit Code loszuwerden

//theImageView.contentMode = .scaleAspectFit 
  1. sicher gleiche ist die Breite und die Höhe für die Bildansicht vornehmen müssen
+0

Das ist vielleicht richtig – onmyway133

+0

Auf den verdammten Punkt! –

+0

2 Stunden den Bach runter, guter Fang :) – 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; 
     }