UIViewContentModeScaleAspect Non riempie il ritaglio


144

Sto provando a disegnare alcune immagini in miniatura a dimensioni fisse (100x100) utilizzando UIImageView . Ho impostato la dimensione del fotogramma della mia vista immagine su 100x100 e ho impostato contentModesu UIViewContentModeScaleAspectFill.

La mia comprensione è che ciò dovrebbe far sì che l'immagine venga disegnata alla dimensione impostata, e l'immagine riempirà l'area dell'immagine e ritaglierà qualsiasi parte dell'immagine al di fuori delle dimensioni impostate per la visualizzazione dell'immagine. Tuttavia, l'immagine viene comunque disegnata più grande o più piccola della dimensione 100x100 che ho impostato per esso.

Se ho impostato il contentMode a UIviewContentModeScaleToFill, l'immagine viene disegnata esattamente a 100x100, ma è distorta per adattarsi a quelle dimensioni. Qualche idea sul perché il riempimento dell'aspetto non si stacchi come previsto?

Ecco il mio codice:

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

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

Per illustrare meglio, ecco uno screenshot di quello che sto vedendo. I quadrati verdi sono i UIViewcontenuti con UIImageViewcui sto lavorando. Ho impostato il colore di sfondo su verde e la cornice della vista su 100x100. Come test, UIImageViewssono dimensionati su 50x50. Come puoi vedere, quando si utilizza il ...AspectFill, le immagini non hanno dimensioni di 50x50 e in alcuni casi sono sfalsate rispetto a quelle che vorrei. Quando vengono utilizzati ...ScaleToFill, sono dimensionati correttamente, ma l'immagine è distorta.

Schermata che illustra il problema

Risposte:


352

Puoi provare a impostare la clip sui limiti

[_photoview setClipsToBounds:YES];

O direttamente nel tuo Storyboard / Xib se puoi:

inserisci qui la descrizione dell'immagine


10
Questo è stato - grazie. (Ho aggiunto lo screenshot sopra per mostrare meglio quello che stavo vedendo, più come esempio se qualcun altro si imbatte in questo problema.)
Josh Buhler,

3
In InterfaceBuilder, rinominato (inutilmente) in "Clip subview" (NB: in questo caso, non elimina "subview", il nome è errato: clip SELF AND subview)
Adam

3
Spuntare l'opzione "Clip Subviews" nel file NIB fa la stessa cosa. Saluti.
codeburn

E se vuoi aggiungere un'ombra usando la proprietà CALayer :( aggiungere un'altra vista dietro non è l'ideale per me
Rambatino,

Se stai usando Auto Layout come me, c'è un'altra possibile causa, che è NSLayoutConstraint "UIView-Encapsulated-Layout-Height" che rompe i vincoli di dimensione UIImageView.
ewiinnnnn,

8

Se vuoi espandere le tue conoscenze, c'è un ottimo articolo su come viene reso lo stack UIView di iOS . C'è anche un articolo più approfondito sull'intera pipeline di disegno .

In sintesi:

  1. Rasterizzazione : tutto il contenuto della vista viene rasterizzato (disegnato o un buffer di pixel fuori schermo) nello spazio delle coordinate dei limiti della vista. Questi potrebbero essere dati di immagine o disegni personalizzati (ad es. drawRect:) Ma visualizzare contenuti secondari. Questa rasterizzazione tiene conto delcontentMode proprietà.

    Qualunque cosa al di fuori dei limiti di una vista viene scartata.

  2. Composizione : i risultati sono composti (disegnati uno sopra l'altro) dalla sottoview alla superview. Questo utilizza la proprietà frame della vista secondaria.

    Se la clipsToBoundsproprietà si trova YESnella superview, scarterà il contenuto della subview al di fuori dei suoi limiti.


2

ha avuto lo stesso problema ed è stato risolto spuntando "Clip Subviews".

L'immagine veniva mostrata correttamente per tutte le viste (3.5,4,4.7,5.5, ipad) nell'anteprima dello storyboard ma non nel simulatore.

Dopo aver spuntato "Clip Subviews" il problema è stato risolto. :)


1

Anche il controllo di "Clip subview" direttamente nello Storyboard / Xib ha funzionato per me. inserisci qui la descrizione dell'immagine


0

I miei subview si stavano ridimensionando e mi sono reso conto che era perché lo xib aveva impostato il layout automatico: inserisci qui la descrizione dell'immagine


0

Se tutto fallisce,

eseguire i clip ai limiti nel metodo viewDidLayoutSubviews.

Esempio :

  override func viewDidLayoutSubviews() {

    imageProfile.layer.cornerRadius = imageProfile.bounds.size.width/2
    imageProfile.clipsToBounds = true
    imageProfile.layer.masksToBounds = true
 }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.