2015-01-03 37 views
12

Quando viene calcolata la dimensione del frame corretta di UIView quando aggiungo il mio UIView personalizzato utilizzando storyboard? Non riesco a ottenere la dimensione del fotogramma corretta in di UIViewinit(frame: CGRect) o init(coder aDecoder: NSCoder) o awakeFromNib(). Ottengo la dimensione corretta in override func layoutSubviews() ma questa volta la vista non viene aggiunta alla vista del controller della vista.Dove ottenere le dimensioni del frame di UIView personalizzato nella sottoclasse

Edit:
io voglio fare questo nella sottoclasse UIView perché aggiungo uno strato CAGradientLayer (che ha la stessa dimensione con mio punto di vista) per mia abitudine UIView. Ci deve essere un modo migliore di impostare la vista nel metodo UIViewController s viewDidLayoutSubviews.

Esistono due vincoli verticali (trailing e leading space a superview) che regolano la larghezza della mia vista personalizzata. Ma la larghezza è 600 nei metodi citati, non nella larghezza dello schermo.

+0

'Ho ottenuto la dimensione corretta nel layout funzionale overrideSubviews() ma questa volta la vista non viene aggiunta alla vista del controller della vista. Perché? – akashivskyy

+0

Non ne ho idea. La domanda riguarda questo :) Non appare. – osrl

risposta

21
func viewWillAppear(_ animated: Bool) 

Questo viene chiamato viewController dopo che la gerarchia della vista è a posto e la geometria è impostata.

In genere è il posto migliore per ordinare il codice viewController dipendente dalla geometria e viene chiamato appena prima dell'esecuzione delle animazioni di transizione.

È seguito da una chiamata a viewDidAppear che viene chiamata dopo che le animazioni di transizione sono state completate.

aggiornamento

come si desidera impostare questo direttamente in una visualizzazione personalizzata (piuttosto che nel viewController) la funzione UIView appropriata per ignorare è layoutSubviews. Assicurati di chiamare super.layoutSubviews() nell'override.

override func layoutSubviews() { 
    super.layoutSubviews() 
    //self.frame will be correct here 
} 

Questo sarà chiamato dopo viewWillAppear e prima viewDidAppear

aggiornamento 2 del viewController: CollectionView cellule celle della vista Collection ottengono i loro dati di trama dal layout del CollectionView. Quando una cellula ha bisogno di sapere che è la geometria, è possibile escludere applyLayoutAttributes

func applyLayoutAttributes(_ layoutAttributes: UICollectionViewLayoutAttributes!) 

Una delle layoutAttributes default è la proprietà telaio.Vedi anche il mio commento qui sotto su come estrarre il frame direttamente da collectionView.layout.

+1

'Voglio farlo nella sottoclasse UIView' – osrl

+0

@osrl, vedere il mio aggiornamento – foundry

+0

' Ho la dimensione corretta in override func layoutSubviews() ma questa volta il la vista non viene aggiunta alla vista del controller della vista' o almeno non la vedo. – osrl

0

Si dovrebbe avere un IBOutlet per il tuo UIView e nel metodo viewDidLayoutSubviews(), ottenere la dimensione di yourViewOutlet.frame.size.

+0

Spiacente, ho aggiunto un'infrazione mancante – osrl

0

Poiché il numero viewDidLayoutSubviews() viene richiamato più volte, si consiglia di utilizzare il delegato viewDidAppear().

viewDidLoad() viene chiamato prima dell'impostazione di qualsiasi frame.

viewDidLayoutSubviews() viene chiamato durante il dimensionamento del frame e verrà chiamato più volte con dimensioni di frame diverse (in genere frameZero prima che venga calcolato un frame).

viewDidAppear() Tutti i frame sono impostati.

+0

Spiacente, ho aggiunto un'infrazione mancante – osrl