L'aspect UIImage s'adapte et s'aligne en haut

Il semble que l' aspect fit aligne l'image au bas du cadre par défaut. Y at-il un moyen de contourner l'alignment tout en gardant l' aspect fit intact?

** MODIFIER **

Cette question est antérieure à la layout automatique. En fait, la layout automatique a été révélée dans WWDC 2012 la même semaine, cette question a été posée

En bref, vous ne pouvez pas faire cela avec un UIImageView .

Une solution consiste à sous- UIView un UIView contenant un UIImageView et à changer son image en fonction de la taille de l'image. Par exemple, vous pouvez find une version ici .

J'ai eu un problème similaire. Le moyen le plus simple était de créer sa propre sous-class de UIImageView. J'ajoute pour les propriétés de la sous-class 3 maintenant il peut être utilisé facilement sans connaître la mise en œuvre interne:

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

Vous pouvez le vérifier ici: https://github.com/LucasssD/LDAlignmentImageView

Il suffit de définir la priorité de contrainte de layout inférieure de imageView au plus bas (250) et cela fera l'affaire

Le moyen de le faire est de modifier le contenu de la couche UIImageView. Le code suivant de mon projet (sous-class de UIImageView) suppose scaleToFill et décale l'image de sorte qu'elle s'aligne en haut, en bas, à gauche ou à droite au lieu de l'alignment par défaut du centre. Pour aspectFit est serait une solution similaire.

 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; } 

J'ai résolu cela nativement dans Interface Builder en définissant une contrainte sur la hauteur de UIImageView, car l'image serait toujours «poussée» lorsque l'image était plus grande que la taille de l'écran.

Plus précisément, je mets UIImageView à la même hauteur que View (via la contrainte de hauteur), puis positionne UIImageView avec des contraintes d'espacement dans IB. Ceci a pour résultat que l'UIImageView a un 'Aspect Fit' qui respecte toujours la contrainte d'espacement supérieure que j'ai définie dans IB.

Si vous êtes en mesure de sous- UIImageView , vous pouvez simplement replace l' image var.

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

En Objective-C, vous pouvez faire la même chose en écrasant le setter.