2010-11-30 10 views
94

Estoy un poco perdido. Utilicé la propiedad de capa de UIView para redondear las esquinas de múltiples elementos en mi aplicación. Sin embargo, este UIImageView simplemente no está cumpliendo. No estoy seguro de lo que me estoy perdiendo.Configuración de radio de esquina en UIImageView no funciona

El UIImageView (llamado previewImage) está contenido en una celda de vista de tabla. Intenté configurar la ubicación de la propiedad cornerRadius en varias ubicaciones (en la celda misma y en el controlador que crea la celda) en vano.

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

¿Hay algo sobre la forma en que se cargan las células que me faltan?

Respuesta

317

Tiene que establecer la propiedad de la capa masksToBounds a YES:

cell.previewImage.layer.masksToBounds = YES;

Esto es debido a que el control de UIImageView crea un pseudo-subvista para contener el objeto UIImage.

+12

Cuidado con este será un gran golpe de rendimiento – jjxtra

+5

¿Por qué es un golpe de rendimiento? – Michael

+0

@PsychoDad ¿Por qué? –

11

creo que es necesario establecer:

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

Esto debería funcionar

cell.previewImage.clipsToBounds = YES; 

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

No estoy seguro de que 'clipsToBounds' sea un método en la clase posterior. Creo que es 'masksToBounds' como el anterior. –

+3

@AlfieHanssen capas tienen máscarasToBounds :, las vistas tienen clipsToBounds: – Kevin

3

En Xcode Interface Builder, la selección de atributos de dibujo 'Clip subvistas' para la vista, junto con el establecimiento de la radio de esquina en ¡el código cell.previewImage.layer.cornerRadius = 20; hace el trabajo por mí!

See 'Clip Subviews' option in IB

2

Prueba esto a continuación pieza de código

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

También digno de mención que

  1. Si está utilizando aspectFit Y CornerRadius con clipsToBounds/masksToBounds, no obtendrá la esquinas redondeadas.

es decir si usted tiene este

theImageView.contentMode = .scaleAspectFit 

y

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

o

theImageView.layer.masksToBounds = true 

Se no funcionará. que tendrá que deshacerse de código aspectFit

//theImageView.contentMode = .scaleAspectFit 
  1. Asegúrese de que el ancho de y la altura de la imagen de visión es la misma
+0

Esto puede ser correcto – onmyway133

+0

¡En el maldito punto! –

+0

2 horas por el desagüe, buena captura :) – 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; 
     } 
Cuestiones relacionadas