2012-06-14 3 views
34

Es sieht so aus, als ob das Bild standardmäßig an den unteren Rand des Rahmens ausgerichtet wird (aspect fit). Gibt es einen Weg zu übersteuern die Ausrichtung, während aspect fit intakt zu halten?UMit dem Aspekt anpassen und nach oben ausrichten

** EDIT **

Diese Frage früher Auto-Layout. In der Tat wurde Auto-Layout in der WWDC 2012 in der gleichen Woche enthüllt, die diese Frage gestellt wurde

+3

Ich weiß, das ist alt, aber diese Lösung ist toll für Leute, die diesen Thread wie ich gefunden: https://github.com/reydanro/UIImageViewAligned – tommybananas

Antwort

21

Kurz gesagt, Sie können dies nicht mit einer UIImageView tun.

Eine Lösung besteht darin, eine UIView mit einem UIImageView Unterklasse zu bilden und den Rahmen entsprechend der Bildgröße zu ändern. Zum Beispiel können Sie eine Version here finden.

+0

Wenn Sie UIImageView überschreiben können (wie ich unten tun) Sie können es in einem Schuss tun –

+1

Nicht ganz der gleiche Effekt OP erforderlich. – Mundi

-2

Wenn Sie die Unterklasse UIImageView ableiten können, dann können Sie einfach die image var.

In Objective-C können Sie das Gleiche tun, indem Sie den Setter überschreiben.

0

Der Weg dies zu tun, ist die Inhalte der UIImageView Schicht zu ändern. Der folgende Code aus meinem Projekt (Unterklasse von UIImageView) setzt scaleToFill voraus und versetzt das Bild so, dass es oben, unten, links oder rechts anstelle der standardmäßigen Mittelausrichtung ausgerichtet ist. Für AspectFit wäre eine ähnliche Lösung.

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

ich das nativ in Interface Builder gelöst durch eine Beschränkung auf der Höhe der UIImageView Einstellung, da das Bild immer ‚geschoben‘ werden würde, wenn das Bild größer als die Größe Bildschirm war.

Genauer gesagt, setze ich die UIImageView auf die gleiche Höhe wie die Ansicht ist es (über Höhe Einschränkung), dann positioniert die UIImageView mit Abstand Einschränkungen in IB. Dies führt dazu, dass die UIImageView einen "Aspect Fit" hat, der immer noch die obere Beabstandungseinschränkung berücksichtigt, die ich in IB einstelle.

1

Ich hatte ähnliches Problem. Der einfachste Weg war, eine eigene Unterklasse von UIImageView zu erstellen. Ich füge für Unterklasse 3 Eigenschaften so jetzt kann es easly interne Implementierung ohne zu wissen, verwenden werden:

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

Sie es können hier überprüfen: https://github.com/LucasssD/LDAlignmentImageView

3

Gerade gesetzt Imageview der untere Layout-Beschränkungs Priorität zur niedrigsten (dh 250) und es wird die Arbeit tun

Verwandte Themen