2015-01-15 20 views
16

UIImageView renderuje niepoprawnie rozmiar obrazu. Używając skalowania dopasowania aspektu, jeśli UIImageView jest kwadratem, obraz ma prawidłowy współczynnik proporcji z przezroczystością w obszarach, w których obraz się nie wypełnia.Swift UIImageView Rozciągnięty aspekt

//Image is Square & Correct Size 
var imageView = UIImageView(frame: CGRectMake(0, 50, 320, 320)) 
imageView.clipsToBounds = true 
imageView.contentMode = UIViewContentMode.ScaleAspectFit 

//Image is Rectangle & Incorrect Size 
var imageView = UIImageView(frame: CGRectMake(0, 50, 320, 450)) 
imageView.clipsToBounds = true 
imageView.contentMode = UIViewContentMode.ScaleAspectFit 

UIImageView musi dotknąć krawędzi i mieć przejrzystą przestrzeń na górze i na dole ekranu i obraz wewnątrz musi zachować swój pierwotny stosunek zamiast rozciągania wyższy. Dołączyłem dwa obrazy przedstawiające sposób renderowania obrazu wewnątrz UIImageView.

ImageView with correct Aspect ImageView with wrong Aspect

Odpowiedz

30

Dodałem maskę autoreizing do UIImageView i teraz wyświetla poprawne stosunki.

imageView.autoresizingMask = UIViewAutoresizing.FlexibleBottomMargin | UIViewAutoresizing.FlexibleHeight | UIViewAutoresizing.FlexibleRightMargin | UIViewAutoresizing.FlexibleLeftMargin | UIViewAutoresizing.FlexibleTopMargin | UIViewAutoresizing.FlexibleWidth 
imageView.contentMode = UIViewContentMode.ScaleAspectFit 

ta odpowiedź pomogła mi: Captured photo is stretched with AVCaptureSession sessionPreset = AVCaptureSessionPresetPhoto jak używałem zdjęcie, które zostało zrobione przez kamerę komórkowych.

+4

Kod Swift 3: imageView.autoresizingMask = [.flexibleTopMargin, .flexibleHeight, .flexibleRightMargin,.flexibleLeftMargin, .flexibleTopMargin, .flexibleWidth] – Markymark

+1

@george Grover Ta odpowiedź jest nieaktualna, prosimy ją zaktualizować. –

5

To zamierzone zachowanie dla UIViewContentMode.ScaleAspectFit. Od docs:

UIViewContentModeScaleAspectFit

Opcja skalowania zawartości do dopasowania wielkość widoku poprzez utrzymywanie proporcji. Każdy pozostały obszar obszaru widoku jest przezroczysty.

Wydaje się od tego, co opisują, że trzeba UIViewContentMode.ScaleAspectFill

UIViewContentModeScaleAspectFill

opcję skalowania zawartości do wypełnić rozmiaru widoku. Część zawartości może zostać przycięta , aby wypełnić granice widoku.

+0

Chcę obraz, aby dopasować okno np kiedy skrzynia się podnosi, boki dotykają krawędzi i pozostaje przezroczysta przestrzeń u góry iu dołu. ScaleAspectFill nie daje takiego wyniku, jak byś go zmusił do dotknięcia boków, ale nie do góry i do dołu? –

+0

Dobrze, myślałem, że mówisz, że nie chcesz tego, co jest przezroczyste. Przepraszam, źle cię zrozumiałem. – Cezar

+0

Przepraszam, nie wyjaśniłem się właściwie - zaktualizowałem moje pytanie, aby to wyjaśnić. Czy masz jakieś wyobrażenie o tym, dlaczego obraz rozwija się w pionie, a nie w poziomie? –

9

Wystąpił ten sam problem, a to, co naprawiło to dla mnie, polegało na ustawieniu obrazu imageView po ustawieniu trybu zawartości. IE:

self.imageView.contentMode = UIViewContentMode.ScaleAspectFit 
    self.imageView.image = imageChosen 

Cheers

13

Swift 3 wersja kodu:

imageView.autoresizingMask = [.flexibleWidth, .flexibleHeight, .flexibleBottomMargin, .flexibleRightMargin, .flexibleLeftMargin, .flexibleTopMargin] 
imageView.contentMode = .scaleAspectFit // OR .scaleAspectFill 
imageView.clipsToBounds = true