2012-11-01 7 views
10

Dopo aver aggiornato il mio progetto a iOS 6, mi sono reso conto che il layout automatico è efficace solo in viewDidAppear e gran parte del mio codice si aspetta che il frame della vista sia disponibile in viewDidLoad. Questa limitazione rende quasi inutile per me la bella funzionalità di layout automatico. C'è qualche suggerimento per aiutarmi a utilizzare il layout automatico?Il layout automatico di Xcode è efficace solo in viewDidAppear e questo è molto problematico

Ad esempio, a volte lo sviluppatore deve modificare le informazioni su una sottoview in base a dove il layout automatico sceglie di posizionare quella particolare sottoview. La posizione finale della sotto-visualizzazione non può essere verificata dallo sviluppatore fino a quando l'utente non l'ha già visto. L'utente non dovrebbe vedere questi aggiustamenti delle informazioni, ma presentare i risultati finali tutto in una volta.

In particolare: Cosa fare se si desidera modificare un'immagine in una vista in base alla posizione in cui il layout automatico posiziona tale visualizzazione? Non posso interrogare quel luogo e poi cambiare l'immagine senza che l'utente se ne accorga.

risposta

6

Come regola generale, i frame/limiti delle viste non dovrebbero mai essere considerati in viewDidLoad.

Il metodo viewDidLoad viene chiamato solo dopo che la vista è stata creata a livello di programmazione o tramite un file .nib/.xib. A questo punto, la vista non è stata configurata, ma solo caricata in memoria.

Si dovrebbe sempre fare il layout di visualizzazione sia in viewWillAppear o viewDidAppear come questi metodi vengono chiamati una volta che la vista è stato preparato per la presentazione.

Come una prova, se semplicemente NSLog(@"frame: %@", NSStringFromCGRect(self.view.frame)); in entrambe le viewDidLoad e viewWillAppear metodi, si vedrà che solo quest'ultimo metodo restituisce la dimensione vista reale in relazione ad eventuali altri elementi avvolti intorno alla vostra vista (come UINavigationBar e UITabBar) .

+7

Il problema che sto avendo è che i punti di vista non sono stati disposti in viewWillAppear :, né dopo, né updateViewConstraints viewDidLayoutSubviews - solo in viewDidAppear: sono il layout di vista (i subviews hanno un telaio che non è CGRectZero) - e a quel punto è troppo tardi per modificare la vista senza che l'utente veda le modifiche. –

+0

Senza vedere il tuo codice, posso solo presumere che tu abbia implementato qualcosa in modo errato, poiché qualsiasi subviews dovrebbe essere sul posto quando è stato chiamato 'viewDidLayoutSubviews'. Aggiorna la tua domanda con un po 'di codice in modo che la gente possa offrire una spiegazione su cosa potrebbe andare storto. – CaptainRedmuff

+1

Da quello che ho visto 'viewDidLayoutSubviews' è spesso chiamato più di una volta ed è solo l'ultima volta in cui può essere fatto affidamento. –

0

Come detto da @charshep in un commento, chiamando view.layoutIfNeeded() in viewWillAppear può fare il trucco.

Citazione del suo commento originale

ho avuto problemi a trovare una vista tabella per apparire alla posizione di scorrimento corretta quando spingendolo [...] perché il layout è stato non si verificano fino a dopo viewWillAppear. Ciò significava che il calcolo dello scroll avveniva prima che fosse impostata la dimensione corretta, quindi il risultato era disattivato. Ciò che ha funzionato per me era chiamare layoutIfNeeded seguito dal codice per impostare la posizione di scorrimento in viewWillAppear.

Problemi correlati