2011-07-10 15 views
135

Próbuję narysować kilka miniatur w stałym rozmiarze (100x100) przy użyciu UIImageView. Ustawiłem rozmiar ramki mojego widoku obrazu na 100x100 i ustawiłem contentMode na UIViewContentModeScaleAspectFill.UIViewContentModeScaleAspectFill nie obcinanie

Rozumiem, że powinno to spowodować, że obraz zostanie narysowany w ustawionym rozmiarze, a obraz wypełni obszar obrazu i przyciąć dowolne fragmenty obrazu, których rozmiar jest inny niż ustawiony dla obrazu. widok. Obraz jest jednak nadal większy lub mniejszy niż rozmiar 100x100, który dla niego ustawiłem.

Jeśli ustawię contentMode na UIviewContentModeScaleToFill, obraz zostanie narysowany dokładnie na 100x100, ale jest zniekształcony, aby dopasować się do tych wymiarów. Jakieś pomysły, dlaczego wypełnienie aspektu nie jest obcinaniem zgodnie z oczekiwaniami?

Oto mój kod:

_photoView = [[UIImageView alloc] initWithImage:photoImage]; 
_photoView.contentMode = UIViewContentModeScaleAspectFill; 
[self addSubview:_photoView]; 

CGRect photoFrame = _photoView.frame; 
photoFrame.size = CGSizeMake(100, 100); 
_photoView.frame = photoFrame; 

Aby lepiej zilustrować, oto zrzut ekranu, co widzę. Zielone kwadraty to UIView zawierające UIImageView, z którymi pracuję. Ustawiłem kolor tła na zielony, a ramkę widoku na 100x100. Jako test, UIImageViews mają rozmiar 50x50. Jak widać, przy korzystaniu z ...AspectFill obrazy nie mają rozmiaru 50 x 50, aw niektórych przypadkach są przesunięte względem miejsca, w którym chciałbym je mieć. Podczas korzystania z ...ScaleToFill mają one prawidłowy rozmiar, ale obraz jest zniekształcony.

Screenshot illustrating problem

Odpowiedz

337

można wypróbować ustawienie klip do granic

[_photoview setClipsToBounds:YES]; 

lub bezpośrednio w serii ujęć/XIB jeśli można:

enter image description here

+10

Że to - dzięki. (Dodałem zrzut ekranu powyżej, aby lepiej pokazać to, co widziałem, bardziej jako przykład, jeśli ktoś inny natknie się na ten problem.) –

+3

W InterfaceBuilder, zmieniono nazwę (niepomyślnie) na "Klipy subviews" (Uwaga: w tym przypadku nie robi " t clib "subviews", nazwa jest błędna: klipy SELF AND subviews) – Adam

+3

Zaznaczenie opcji "Subviews klipów" w pliku NIB robi to samo. Twoje zdrowie. – codeburn

8

Jeśli chcesz poszerzyć swoją wiedzę jest naprawdę dobry artykuł o tym, jak iOS UIView stack is rendered. Istnieje również bardziej szczegółowy artykuł na temat whole drawing pipeline.

Podsumowując:

  1. rasteryzacja - cała zawartość widoku jest rasterised (rysowane lub bufor pikseli poza ekranem) w przestrzeni współrzędnych widoku za granice. Może to być dane obrazu lub rysunek niestandardowy (to jest drawRect:), ale zawartość podskali. Ta rasteryzacja bierze pod uwagę właściwość contentMode.

    Wszystko poza zakresem widoku jest odrzucane.

  2. Kompozycja - Wyniki są łączone (narysowane jedna na drugiej) z podglądu do super odsyłaczy. Wykorzystuje to właściwość frame widoku podrzędnego.

    Jeśli właściwość clipsToBounds jest YES na SuperView to będzie wyrzucić podrzędny zawartości poza jego granicami.

+0

To, dzięki za to! Wreszcie wyjaśnienie: D –

0

Moi subviewes były rozmiaru i zdałem sobie sprawę, że to dlatego, że zaszło xib układ Auto: enter image description here

2

miał ten sam problem i został rozwiązany poprzez zaznaczenie „Klip subviews”.

Obraz był wyświetlany prawidłowo dla wszystkich widoków (3.5,4,4.7,5.5, ipad) w podglądzie storyboardu, ale nie w symulatorze.

Po zaznaczeniu opcji "Klip subviews" problem został rozwiązany. :)

1

Sprawdzanie "podglądu klipu" bezpośrednio w Storyboard/Xib również działało dla mnie. enter image description here

0

Jeśli wszystko zawiedzie,

robić klipy do granic w metodzie viewDidLayoutSubviews.

przykład:

override func viewDidLayoutSubviews() { 

    imageProfile.layer.cornerRadius = imageProfile.bounds.size.width/2 
    imageProfile.clipsToBounds = true 
    imageProfile.layer.masksToBounds = true 
} 
Powiązane problemy