Establecer el radio de la esquina en UIImageView no funciona

129

Estoy un poco perdido. He usado 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.

El UIImageView (llamado previewImage) está contenido en una celda de vista de tabla. He intentado establecer la ubicación múltiple de la propiedad cornerRadius (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 falta?

MarkPowell
fuente

Respuestas:

377

Debe establecer la masksToBoundspropiedad de la capa en YES:

cell.previewImage.layer.masksToBounds = YES;

Esto se debe a que el UIImageViewcontrol crea una pseudovista secundaria para contener el UIImageobjeto.

Evan Mulawski
fuente
19
A menos que también rasterice la vista (view.layer.shouldRasterize = YES), cada cuadro requerirá una nueva máscara de todos los píxeles.
jjxtra
@jjxtra, así que es mejor configurar shouldRasterize = false?
user924
Si shouldRasterize es falso, usted paga la creación de la máscara por encima de cada cuadro. Si shouldRasterize es verdadero y su capa cambia cada cuadro, usted paga la sobrecarga de la máscara y la sobrecarga de rasterización. El caso ideal es una capa estática (que no cambia muy a menudo) con shouldRasterize = true.
jjxtra
30

También vale la pena señalar que

  1. Si está utilizando AspectFit AND cornerRadius con clipsToBounds / masksToBounds, no obtendrá las esquinas redondeadas.

es decir, si tienes esto

theImageView.contentMode = .scaleAspectFit

y

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

o

theImageView.layer.masksToBounds = true

Que no va a funcionar . Tendrás que deshacerte del código de AspectFit

//theImageView.contentMode = .scaleAspectFit
  1. Asegúrese de que el ancho y el alto de la Vista de imagen sean los mismos
Naishta
fuente
En resumen: establezca la relación de aspecto 1: 1 si desea usar AspectFit
djdance
22

Esto debería funcionar

cell.previewImage.clipsToBounds = YES;

cell.previewImage.layer.cornerRadius = 20;
Teena nath Paul
fuente
3
No estoy seguro clipsToBoundses un método en la clase posterior. Cree que es masksToBoundscomo el anterior.
Alfie Hanssen
44
Las capas de @AlfieHanssen tienen máscarasToBounds :, las vistas tienen clipsToBounds:
Kevin
11

Creo que necesitas configurar:

cell.previewImage.layer.masksToBounds = YES;
cell.previewImage.layer.opaque = NO;
Daniel Dickison
fuente
4

¡En Xcode Interface Builder, seleccionar el atributo de dibujo 'Subvistas de clip' para la vista junto con la configuración del radio de la esquina en el código cell.previewImage.layer.cornerRadius = 20;hace el trabajo para mí!

Consulte la opción 'Subvistas de clip' en IB

koira
fuente
2

Prueba esto debajo del código

cell.previewImage.layer.cornerRadius = 20;
cell.previewImage.clipsToBounds = YES;
Vaibhav Thakre
fuente
2

Prueba este código: -

self.imgaviewName.clipsToBounds = true
self.imageviewName.layer.cornerRadius = 10
kangna sharma
fuente
Se desaconsejan las respuestas de solo código. Haga clic en editar y agregue algunas palabras que resuman cómo su código aborda la pregunta, o quizás explique cómo su respuesta difiere de la respuesta / respuestas anteriores. Gracias
Nick
1

Para imageView.contentMode = .scaleAspectFillel cornerRadiusno se aplica si la imagen es muy grande, dependiendo del hardware.

Algunas pruebas con imágenes panorámicas redimensionadas:

  • iPhone X, tamaño de imagen 5000x1107: 🚫 4000x886: ✅
  • iPhone 6s Plus, tamaño de imagen 10000x2215: 🚫 5000x1107: ✅
  • iPhone 6s, tamaño de imagen 10000x2215: 🚫 5000x1107: ✅

Las dimensiones de imageView donde 160x100. Curiosamente, el hardware más nuevo no es necesariamente más capaz.

¡Siéntase libre de editar esta publicación con más resultados de prueba!

Ortwin Gentz
fuente
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;
       }
Maulik Patel
fuente
0

Respuesta rápida de 4.2:

Para que funcione el radio de la esquina, agregue la imagen a ay UIViewluego debe establecer la masksToBoundspropiedad de la imagen en true:

planeImage.layer.masksToBounds = true
planeImage.layer.cornerRadius = 20

Nota: Reemplace 20 por el deseado cornerRadius

IronmanX46
fuente
0

¿Nada de las respuestas anteriores está funcionando?

Puede suceder que el tamaño de UIImageView sea mayor que el tamaño de la imagen. El radio de la esquina se puede establecer bien pero no visible en ese caso.

Comprobación rápida del tamaño de UIImageView por código: (o puede usar la herramienta "Ver jerarquía de interfaz de usuario" en XCode)

self.imageView.backgroundColor = [UIColor greenColor]; 

En este escenario, debe asegurarse de que UIImageView tenga la misma relación de aspecto que la imagen.

Marek Manduch
fuente