UIViewContentModeScaleAspectFill no se recorta

144

Estoy tratando de dibujar algunas imágenes en miniatura en un tamaño fijo (100x100) usando UIImageView. Establecí el tamaño de fotograma de mi vista de imagen en 100x100, y lo configuré contentModeen UIViewContentModeScaleAspectFill.

Según tengo entendido, esto debería hacer que la imagen se dibuje con el tamaño que configuré, y la imagen llenará el área de la imagen y recortará cualquier parte de la imagen que esté fuera del tamaño que configuré para la vista de imagen. Sin embargo, la imagen todavía se dibuja más grande o más pequeña que el tamaño de 100x100 que configuré para ella.

Si fijo el contentModeque UIviewContentModeScaleToFill, a continuación, la imagen se dibuja exactamente a 100x100, pero está distorsionada para encajar en esas dimensiones. ¿Alguna idea de por qué el relleno de aspecto no es un recorte como se esperaba?

Aquí está mi código:

_photoView = [[UIImageView alloc] initWithImage:photoImage];
_photoView.contentMode = UIViewContentModeScaleAspectFill;
[self addSubview:_photoView];

CGRect photoFrame = _photoView.frame;
photoFrame.size = CGSizeMake(100, 100);
_photoView.frame = photoFrame;

Para ilustrar mejor, aquí hay una captura de pantalla de lo que estoy viendo. Los cuadrados verdes son los que UIViewcontienen el UIImageViewque estoy trabajando. Establecí su color de fondo en verde y el marco de la vista en 100x100. Como prueba, UIImageViewstienen un tamaño de 50x50. Como puede ver, cuando se usa ...AspectFill, las imágenes no tienen un tamaño de 50x50, y en algunos casos se compensan de donde me gustaría. Cuando se usan ...ScaleToFill, tienen el tamaño correcto, pero la imagen está distorsionada.

Captura de pantalla que ilustra el problema

Josh Buhler
fuente

Respuestas:

352

¿Puedes intentar configurar el clip en los límites?

[_photoview setClipsToBounds:YES];

O directamente en su Storyboard / Xib si puede:

ingrese la descripción de la imagen aquí

imthi
fuente
10
Eso fue todo, gracias. (Agregué la captura de pantalla anterior para mostrar mejor lo que estaba viendo, más como un ejemplo si alguien más se encuentra con este problema.)
Josh Buhler
3
En InterfaceBuilder, renombrado (poco útil) a "Clips subviews" (NB: en este caso, no clib "subviews", el nombre es incorrecto: recorta SELF AND subviews)
Adam
3
Marcar la opción 'Subvistas de clip' en el archivo NIB hace lo mismo. Salud.
codeburn
Pero, ¿qué pasa si desea agregar una sombra usando la propiedad CALayer :( agregar otra vista detrás de ella no es ideal para mí
Rambatino
Si está utilizando el diseño automático como yo, hay otra causa posible, que es NSLayoutConstraint "UIView-Encapsulated-Layout-Height" que rompe las restricciones de tamaño de UIImageView.
ewiinnnnn
8

Si desea ampliar su conocimiento, hay un artículo realmente bueno sobre cómo se representa la pila UIView de iOS . También hay un artículo más detallado sobre toda la tubería de dibujo .

En resumen:

  1. Rasterización : todo el contenido de la vista se rasteriza (dibujado o un búfer de píxeles fuera de la pantalla) en el espacio de coordenadas de los límites de la Vista. Esto podría ser datos de imágenes o dibujos personalizados (es decir drawRect:), pero contenido de subvista. Esta rasterización tiene en cuenta la contentModepropiedad.

    Cualquier cosa fuera de los límites de una vista se descarta.

  2. Composición : los resultados se componen (se dibujan uno encima del otro) desde la subvista hasta las supervistas. Esto usa la propiedad de marco de la subvista.

    Si la clipsToBoundspropiedad está YESen la supervista, descartará el contenido de la subvista fuera de sus límites.

Robert
fuente
2

tuvo el mismo problema y se resolvió marcando "Subvistas de clip".

La imagen se mostraba correctamente para todas las vistas (3.5,4,4.7,5.5, ipad) en la vista previa del guión gráfico pero no en el simulador.

Después de marcar "Subvistas de clip", el problema se resolvió. :)

Brackston Mayhall
fuente
1

Verificación de "Subvistas de clip" directamente en Storyboard / Xib también funcionó para mí. ingrese la descripción de la imagen aquí

Maxime T
fuente
0

Mis subvistas cambiaron de tamaño y me di cuenta de que era porque el xib tenía configurado el diseño automático: ingrese la descripción de la imagen aquí

alistair
fuente
0

Si todo falla

hacer los clips a los límites en el método viewDidLayoutSubviews.

Ejemplo:

  override func viewDidLayoutSubviews() {

    imageProfile.layer.cornerRadius = imageProfile.bounds.size.width/2
    imageProfile.clipsToBounds = true
    imageProfile.layer.masksToBounds = true
 }
bharathi kumar
fuente