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.
6 answers
¿Puede intentar establecer el clip a límites
[_photoview setClipsToBounds:YES];
O directamente en su Storyboard / Xib si puede :
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:
-
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 propiedadcontentMode
.Cualquier cosa fuera de los límites de una vista se descarta.
-
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.
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ó. :)
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
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:
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
}
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