ios - animatedimage - El aspecto del UIImage se ajusta y se alinea con la parte superior
objective c uiimage (6)
En resumen, no puedes hacer esto con un UIImageView
.
Una solución es subclasificar una UIView
contenga un UIImageView
y cambiar su marco de acuerdo con el tamaño de la imagen. Por ejemplo, puedes encontrar una versión here .
Parece que el aspect fit
alinea la imagen en la parte inferior del marco de forma predeterminada. ¿Hay alguna manera de anular la alineación manteniendo intacto el aspect fit
?
** EDIT **
Esta pregunta es anterior al diseño automático. De hecho, el diseño automático fue revelado en la WWDC 2012 la misma semana en que se hizo esta pregunta
La forma de hacerlo es modificar el contenido de contenido de la capa UIImageView. El siguiente código de mi proyecto (subclase de UIImageView) asume scaleToFill y compensa la imagen de forma que se alinee en la parte superior, inferior, izquierda o derecha en lugar de la alineación central predeterminada. Para aspectFit sería una solución similar.
typedef NS_OPTIONS(NSUInteger, AHTImageAlignmentMode) {
AHTImageAlignmentModeCenter = 0,
AHTImageAlignmentModeLeft = 1 << 0,
AHTImageAlignmentModeRight = 1 << 1,
AHTImageAlignmentModeTop = 1 << 2,
AHTImageAlignmentModeBottom = 1 << 3,
AHTImageAlignmentModeDefault = AHTImageAlignmentModeCenter,
};
- (void)updateImageViewContentsRect {
CGRect imageViewContentsRect = CGRectMake(0, 0, 1, 1);
if (self.image.size.height > 0 && self.bounds.size.height > 0) {
CGRect imageViewBounds = self.bounds;
CGSize imageSize = self.image.size;
CGFloat imageViewFactor = imageViewBounds.size.width / imageViewBounds.size.height;
CGFloat imageFactor = imageSize.width / imageSize.height;
if (imageFactor > imageViewFactor) {
//Image is wider than the view, so height will match
CGFloat scaledImageWidth = imageViewBounds.size.height * imageFactor;
CGFloat xOffset = 0.0;
if (BM_CONTAINS_BIT(self.alignmentMode, AHTImageAlignmentModeLeft)) {
xOffset = -(scaledImageWidth - imageViewBounds.size.width) / 2;
} else if (BM_CONTAINS_BIT(self.alignmentMode, AHTImageAlignmentModeRight)) {
xOffset = (scaledImageWidth - imageViewBounds.size.width) / 2;
}
imageViewContentsRect.origin.x = (xOffset / scaledImageWidth);
} else if (imageFactor < imageViewFactor) {
CGFloat scaledImageHeight = imageViewBounds.size.width / imageFactor;
CGFloat yOffset = 0.0;
if (BM_CONTAINS_BIT(self.alignmentMode, AHTImageAlignmentModeTop)) {
yOffset = -(scaledImageHeight - imageViewBounds.size.height) / 2;
} else if (BM_CONTAINS_BIT(self.alignmentMode, AHTImageAlignmentModeBottom)) {
yOffset = (scaledImageHeight - imageViewBounds.size.height) / 2;
}
imageViewContentsRect.origin.y = (yOffset / scaledImageHeight);
}
}
self.layer.contentsRect = imageViewContentsRect;
}
Lo solucioné de forma nativa en el Generador de interfaces estableciendo una restricción en la altura del UIImageView, ya que la imagen siempre se "presionaría" cuando la imagen fuera más grande que el tamaño de la pantalla.
Más específicamente, configuré el UIImageView para que sea de la misma altura que la Vista en la que está (a través de la restricción de altura), y luego coloqué el UIImageView con restricciones de espaciado en IB. Esto da como resultado que el UIImageView tenga un ''Ajuste de aspecto'' que aún respeta la restricción de espaciado superior que establecí en IB.
Si puede subclasificar UIImageView
, puede anular la image
var.
override var image: UIImage? {
didSet {
self.sizeToFit()
}
}
En Objective-C puedes hacer lo mismo anulando al setter.
Simplemente establezca la prioridad de restricción de diseño inferior de imageView en la más baja (es decir, 250) y hará el trabajo
Tuve un problema similar. La forma más simple era crear la propia subclase de UIImageView. Añado las propiedades de la subclase 3, por lo que ahora se puede usar fácilmente sin conocer la implementación interna:
@property (nonatomic) LDImageVerticalAlignment imageVerticalAlignment;
@property (nonatomic) LDImageHorizontalAlignment imageHorizontalAlignment;
@property (nonatomic) LDImageContentMode imageContentMode;
Puede verificarlo aquí: https://github.com/LucasssD/LDAlignmentImageView