UIViewContentModeScaleAspectFill no recorte


Estoy tratando de dibujar algunas imágenes en miniatura en un tamaño fijo (100x100) usando UIImageView. He establecido el tamaño del marco de mi vista de imagen para ser 100x100, y establecer el contentMode a UIViewContentModeScaleAspectFill.

Entiendo que esto debería hacer que la imagen se dibuje en el tamaño que establezca, y la imagen llenará el área de la imagen y recortará cualquier porción de la imagen que esté fuera del tamaño que establezca para la vista de imagen. Sin embargo, la imagen todavía se dibuja más grande o más pequeño que el tamaño de 100x100 que establecí para se.

Si establezco el contentMode a UIviewContentModeScaleToFill, entonces 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 se recorta 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 el UIView que contiene el UIImageView con el que estoy trabajando. He establecido su color de fondo a verde, y el marco de la vista a 100x100. Como prueba, los UIImageViews están dimensionados para 50x50. Como se puede ver, cuando se utiliza el ...AspectFill, las imágenes no tienen un tamaño de 50x50, y en algunos casos se desplazan desde donde me gustaría. Cuando se usa ...ScaleToFill, tienen el tamaño correcto, pero la imagen está distorsionada.

Captura de pantalla que ilustra el problema

Author: Josh Buhler, 2011-07-10

6 answers

¿Puede intentar establecer el clip a límites

[_photoview setClipsToBounds:YES];

O directamente en su Storyboard / Xib si puede :

introduzca la descripción de la imagen aquí

 344
Author: imthi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-26 22:35:45

Si desea ampliar sus conocimientos, hay un artículo realmente bueno sobre cómo se renderiza la pila iOS UIView. También hay un artículo más profundo sobre 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 imagen o dibujo personalizado (es decir, drawRect:), pero subdividir el contenido. Esta rasterización tiene en cuenta la propiedad contentMode.

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

  2. Composition - Los resultados se componen (dibujados uno encima del otro) de subview a superviews. Esto usa la propiedad frame del subview.

    Si la propiedad clipsToBounds está YES en el superview, entonces descartará el contenido de subview fuera de sus límites.

 8
Author: Robert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-14 17:16:09

Tenía el mismo problema y se resolvió marcando "Clip Subviews".

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

Después de marcar "Clip Subviews" el problema se resolvió. :)

 2
Author: Brackston Mayhall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-06 21:35:49

Comprobar "Subviews Clip" directamente en el Storyboard/Xib también funcionó para mí. introduzca la descripción de la imagen aquí

 2
Author: Maxime T,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-26 21:44:26

Mis subviewes estaban redimensionando y me di cuenta de que era porque el xib tenía un diseño automático establecido: introduzca la descripción de la imagen aquí

 0
Author: alistair,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-25 21:13:23

Si todo falla,

Haga 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
 }
 0
Author: bharathi kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-06 10:09:05