2012-06-14 11 views
34

Parece que aspect fit alinea la imagen en la parte inferior del marco de forma predeterminada. ¿Hay alguna manera de de anular la alineación manteniendo intacta aspect fit?UII aspecto del aspecto adecuado y alineado a la parte superior

** ** EDITAR

Esta pregunta anterior diseño automático. De hecho, el diseño automático se estaba revelando en la WWDC 2012 la misma semana que se hizo esta pregunta

+3

Sé que esto es antiguo, pero esta solución es increíble para las personas que encuentran este hilo como lo hice: https://github.com/reydanro/UIImageViewAligned – tommybananas

Respuesta

21

En resumen, no puede hacer esto con un UIImageView.

Una solución es crear una subclase UIView que contiene un UIImageView y cambiar su marco de acuerdo con el tamaño de la imagen. Por ejemplo, puede encontrar una versión here.

+0

Si puede anular UIImageView (como hago a continuación) puede hacerlo de una sola vez –

+1

No es exactamente el mismo efecto OP necesario. – Mundi

-2

Si puede crear la subclase UIImageView, puede anular la image var.

override var image: UIImage? { 
    didSet { 
     self.sizeToFit() 
    } 
} 

En Objective-C puede hacer lo mismo sobrescribiendo al colocador.

0

La forma de hacerlo es modificar el 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; 
} 
0

He resuelto de forma nativa en el Interface Builder mediante el establecimiento de una limitación de la altura de la UIImageView, ya que la imagen siempre sería 'empujado' cuando la imagen era 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 ubiqué 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.

1

Tuve un problema similar. La forma más simple era crear la propia subclase de UIImageView. Añado para las subclases 3 propiedades por lo que ahora se puede utilizar fácilemte sin saber implementación interna:

@property (nonatomic) LDImageVerticalAlignment imageVerticalAlignment; 
@property (nonatomic) LDImageHorizontalAlignment imageHorizontalAlignment; 
@property (nonatomic) LDImageContentMode imageContentMode; 

se puede comprobar aquí: https://github.com/LucasssD/LDAlignmentImageView

3

Sólo hay que establecer prioridades diseño limitación inferior de imageView a más bajo (es decir, 250) y hará el trabajo

Cuestiones relacionadas