ios - objective - UIViewContentModeScaleAspectFill no recorte
uiimageview set image swift (6)
¿Puedes intentar ajustar el clip a los límites?
[_photoview setClipsToBounds:YES];
O directamente en su Storyboard / Xib si puede:
Estoy tratando de dibujar algunas imágenes en miniatura a un tamaño fijo (100x100) usando UIImageView
. Establecí el tamaño de fotograma de mi vista de imagen en 100x100 y configuré el modo de contentMode
en UIViewContentModeScaleAspectFill
.
Según entiendo, esto debería provocar que la imagen se dibuje en 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 la imagen. Sin embargo, la imagen aún se dibuja más grande o más pequeña que el tamaño de 100x100 que configuré para ella.
Si configuro UIviewContentModeScaleToFill
en UIviewContentModeScaleToFill
, la imagen se dibuja exactamente a 100x100, pero está distorsionada para ajustarse a esas dimensiones. ¿Alguna idea de por qué el relleno de aspecto no está recortando 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
contiene el UIImageView
que estoy trabajando. Establecí el color de fondo en verde y el marco de la vista en 100x100. Como prueba, los UIImageViews
tienen un tamaño de 50x50. Como puede ver, al usar el ...AspectFill
, las imágenes no tienen un tamaño de 50x50, y en algunos casos están desfasadas de donde me gustaría. Al usar ...ScaleToFill
, tienen el tamaño correcto, pero la imagen está distorsionada.
Mis subvistas estaban cambiando de tamaño y me di cuenta de que era porque el xib tenía un conjunto de diseño automático:
Si desea ampliar su conocimiento, hay un artículo realmente bueno sobre cómo se procesa la pila UIView de iOS . También hay un artículo más detallado sobre todo el proceso de diseño .
En resumen:
Rasterización : todo el contenido de la vista se trama (dibujado o un buffer de píxeles fuera de 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 subvista de contenido. Esta rasterización tiene en cuenta la propiedadcontentMode
.Cualquier cosa fuera de los límites de una vista se descarta.
Composición : los resultados se componen (dibujados uno encima del otro) desde la subvista hasta las supervistas. Esto usa la propiedad de marco de la subvista.
Si la propiedad
clipsToBounds
esYES
en la supervista, descartará el contenido de la subvista fuera de sus límites.
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
}
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ó. :)