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é contentMode
en 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 contentMode
que 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 UIView
contienen el UIImageView
que estoy trabajando. Establecí su color de fondo en verde y el marco de la vista en 100x100. Como prueba, UIImageViews
tienen 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.
fuente
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:
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 lacontentMode
propiedad.Cualquier cosa fuera de los límites de una vista se descarta.
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
clipsToBounds
propiedad estáYES
en la supervista, descartará el contenido de la subvista fuera de sus límites.fuente
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ó. :)
fuente
Verificación de "Subvistas de clip" directamente en Storyboard / Xib también funcionó para mí.
fuente
Mis subvistas cambiaron de tamaño y me di cuenta de que era porque el xib tenía configurado el diseño automático:
fuente
Si todo falla
hacer los clips a los límites en el método viewDidLayoutSubviews.
Ejemplo:
fuente