Próbuję narysować kilka miniatur o stałym rozmiarze (100x100) za pomocą UIImageView
. Mam ustawić rozmiar ramki obrazu moim zdaniem być 100x100 i ustaw contentMode
się UIViewContentModeScaleAspectFill
.
Rozumiem, że powinno to spowodować, że obraz zostanie narysowany w ustawionym przeze mnie rozmiarze, a obraz wypełni obszar obrazu i przycina wszystkie części obrazu, które wykraczają poza rozmiar, który ustawiłem dla widoku obrazu. Jednak obraz jest nadal większy lub mniejszy niż rozmiar 100x100, który dla niego ustawiłem.
Jeżeli ustawić contentMode
się UIviewContentModeScaleToFill
, a następnie obraz jest rysowany dokładnie 100x100, ale jest zniekształcony, aby pasowały do tych wymiarów. Jakieś pomysły, dlaczego wypełnienie aspektu nie jest przycinane 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 tego, co widzę. Zielone kwadraty UIView
zawierają elementy, z UIImageView
którymi pracuję. Ustawiłem ich kolor tła na zielony, a ramkę widoku na 100x100. W teście, UIImageViews
mają wymiary 50x50. Jak widać, w przypadku korzystania z ...AspectFill
obrazu obrazy nie mają rozmiaru 50x50, a w niektórych przypadkach są przesunięte w stosunku do tego, co chciałbym. Podczas używania ...ScaleToFill
mają prawidłowe rozmiary, ale obraz jest zniekształcony.
źródło
Jeśli chcesz poszerzyć swoją wiedzę, jest naprawdę dobry artykuł o tym, jak renderowany jest stos iOS UIView . Istnieje również bardziej szczegółowy artykuł na temat całego procesu rysowania .
W podsumowaniu:
Rasteryzacja - cała zawartość widoku jest rasteryzowana (rysowana lub bufor pikseli poza ekranem) w przestrzeni współrzędnych w granicach widoku. Mogą to być dane obrazu lub niestandardowy rysunek (tj.
drawRect:
), Ale zawartość widoku podrzędnego. Ta rasteryzacja uwzględniacontentMode
właściwość.Wszystko poza granicami widoku jest odrzucane.
Kompozycja - wyniki są zestawiane (narysowane jeden na drugim) z podwidoku do superwizji. Wykorzystuje to właściwość frame widoku podrzędnego.
Jeśli
clipsToBounds
właściwość znajdujeYES
się w superviewie, odrzuca zawartość subview poza jej granice.źródło
miał ten sam problem i został rozwiązany przez zaznaczenie opcji „Podglądy klipów”.
Obraz był wyświetlany poprawnie dla wszystkich widoków (3.5,4,4,7,5.5, ipad) w podglądzie scenorysu, ale nie w symulatorze.
Po zaznaczeniu opcji „Podglądy klipów” problem został rozwiązany. :)
źródło
Sprawdzanie „Podglądy klipów” bezpośrednio w Storyboard / Xib również działało.
źródło
Moje podwidoki zmieniły rozmiar i zdałem sobie sprawę, że to dlatego, że xib miał ustawiony automatyczny układ:
źródło
Jeśli wszystko zawiedzie,
wykonaj klipy do granic w metodzie viewDidLayoutSubviews.
Przykład:
źródło