2015-01-15 23 views
16

UIImageView esegue il rendering delle dimensioni di un'immagine in modo errato. Utilizzando Scala proporzioni, se UIImageView è un quadrato, l'immagine è il rapporto proporzionale corretto con trasparenza nelle aree che l'immagine non riempie.Swift UIImageView Aspetto allungato

//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 

L'UIImageView deve toccare i bordi ed avere spazio trasparente nella parte superiore e inferiore dello schermo e l'immagine all'interno bisogna tenere il rapporto originale anziché allungamento alto. Ho allegato due immagini di come viene riprodotta l'immagine all'interno di UIImageView.

ImageView with correct Aspect ImageView with wrong Aspect

risposta

30

Ho aggiunto una maschera di autorizzazione a UIImageView e ora visualizza i rapporti corretti.

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

Questa risposta mi ha aiutato: Captured photo is stretched with AVCaptureSession sessionPreset = AVCaptureSessionPresetPhoto come stavo usando un'immagine che è stata presa attraverso la fotocamera cellulari.

+4

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

+1

@george Grover Questa risposta è obsoleta, aggiornala gentilmente. –

5

Questo è il comportamento previsto per UIViewContentMode.ScaleAspectFit. Dalla documentazione:

UIViewContentModeScaleAspectFit

L'opzione per scalare il contenuto per adattarlo la dimensione della vista mantenendo le proporzioni. L'eventuale area rimanente dei limiti della vista è trasparente.

Sembra da ciò che si descrive che è necessario UIViewContentMode.ScaleAspectFill

UIViewContentModeScaleAspectFill

L'opzione per adattare il contenuto al riempire la dimensione della vista. Parte del contenuto può essere ritagliata per riempire i limiti della vista.

+0

voglio l'immagine per adattarla casella per esempio quando la scatola diventa più alta i lati toccano i bordi e rimane uno spazio trasparente in alto e in basso. ScaleAspectFill non fornisce questo risultato, come suggeriresti di forzarlo a toccare i lati ma non sopra e sotto? –

+0

Giusto, pensavo che stavi dicendo che non volevi la trasparenza. Mi dispiace aver frainteso te. – Cezar

+0

Mi spiace, non mi sono spiegato correttamente - ho aggiornato la mia domanda per chiarire. Hai qualche idea sul perché l'immagine sta crescendo verticalmente piuttosto che orizzontalmente? –

9

Stavo avendo lo stesso problema, e quello che ha risolto per me era assicurarsi di impostare l'immagine imageView dopo aver impostato la modalità di contenuto. vale a dire:

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

Acclamazioni

13

Swift 3 versione del codice:

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