Ich versuche, einige Miniaturbilder in einer festen Größe (100 x 100) mit zu zeichnen UIImageView
. Ich habe die Bildgröße meiner Bildansicht auf 100 x 100 festgelegt und contentMode
auf UIViewContentModeScaleAspectFill
.
Mein Verständnis ist, dass dies dazu führen sollte, dass das Bild in der von mir festgelegten Größe gezeichnet wird und das Bild den Bereich des Bildes ausfüllt und alle Teile des Bildes ausschneidet, die außerhalb der für die Bildansicht festgelegten Größe liegen. Das Bild wird jedoch immer noch größer oder kleiner als die von mir festgelegte Größe von 100 x 100 gezeichnet.
Wenn ich das contentMode
auf setze UIviewContentModeScaleToFill
, wird das Bild mit genau 100 x 100 gezeichnet, aber es ist verzerrt, um in diese Dimensionen zu passen. Irgendwelche Ideen, warum die Aspektfüllung nicht wie erwartet abgeschnitten wird?
Hier ist mein Code:
_photoView = [[UIImageView alloc] initWithImage:photoImage];
_photoView.contentMode = UIViewContentModeScaleAspectFill;
[self addSubview:_photoView];
CGRect photoFrame = _photoView.frame;
photoFrame.size = CGSizeMake(100, 100);
_photoView.frame = photoFrame;
Zur besseren Veranschaulichung hier ein Screenshot von dem, was ich sehe. Die grünen Quadrate UIView
enthalten die, mit denen UIImageView
ich arbeite. Ich habe ihre Hintergrundfarbe auf Grün und den Rahmen der Ansicht auf 100x100 eingestellt. Als Test sind die UIImageViews
auf 50x50 dimensioniert. Wie Sie sehen können ...AspectFill
, sind die Bilder bei Verwendung von nicht auf 50 x 50 dimensioniert und in einigen Fällen von der gewünschten Stelle versetzt. Bei Verwendung ...ScaleToFill
haben sie die richtige Größe, aber das Bild ist verzerrt.
quelle
Wenn Sie Ihr Wissen erweitern möchten, gibt es einen wirklich guten Artikel darüber, wie der iOS UIView-Stack gerendert wird . Es gibt auch einen ausführlicheren Artikel über die gesamte Zeichnungspipeline .
Zusammenfassend:
Rasterisierung - Der gesamte Inhalt der Ansicht wird im Koordinatenraum der Grenzen der Ansicht gerastert (gezeichnet oder ein Pixelpuffer außerhalb des Bildschirms). Dies können Bilddaten oder benutzerdefinierte Zeichnungen (dh
drawRect:
) sein, aber Unteransichtsinhalte. Diese Rasterung berücksichtigt diecontentMode
Eigenschaft.Alles, was außerhalb der Grenzen einer Ansicht liegt, wird verworfen.
Zusammensetzung - Die Ergebnisse werden von der Unteransicht bis zur Übersicht zusammengesetzt (übereinander gezeichnet). Dies verwendet die Rahmeneigenschaft der Unteransicht.
Wenn sich die
clipsToBounds
EigenschaftYES
in der Übersicht befindet, werden Inhalte der Unteransicht außerhalb ihrer Grenzen verworfen .quelle
hatte das gleiche Problem und es wurde durch Aktivieren von "Clip Subviews" behoben.
Das Bild wurde in der Storyboard-Vorschau für alle Ansichten (3.5,4,4.7,5.5, ipad) korrekt angezeigt, jedoch nicht im Simulator.
Nachdem ich "Clip Subviews" angekreuzt hatte, wurde das Problem behoben. :) :)
quelle
Das Aktivieren von "Clip-Unteransichten" direkt im Storyboard / Xib hat auch bei mir funktioniert.
quelle
Die Größe meiner Unteransichten wurde geändert, und mir wurde klar, dass für das xib das automatische Layout festgelegt war:
quelle
Wenn alles fehlschlägt,
Führen Sie die Clips in der viewDidLayoutSubviews-Methode bis an die Grenzen aus.
Beispiel:
quelle