2016-03-21 17 views
8

Ho usato i vincoli di autolayout dallo storyboard. Tuttavia, in alcuni casi, voglio calcolare l'altezza dinamica della sottoview. Lo codice in viewDidAppear(), funziona bene perché questo metodo viene chiamato dopo che tutti i frame di visualizzazione sono stati impostati dai vincoli di layout. Il problema qui è che posso vedere il frame impostato dai vincoli per mezzo secondo. E poi il codice riorganizza la vista.Quando i vincoli di autolayout impostano i frame durante il ciclo di vita del controller di visualizzazione?

Sono venuto a conoscenza di viewDidLayout() che viene chiamato dopo i vincoli ha impostato la cornice in modo che possa cambiare. Ma non funziona. È come questo metodo viene chiamato prima che vengano usati i vincoli.

risposta

6

Il metodo viewDidAppear viene chiamato al termine del ciclo di vita della vista. Quindi se cambi qui i vincoli, sarà sempre visibile.

Se il cambiamento che si desidera effettuare è un evento una volta, è possibile farlo nel metodo viewWillAppear. Ma questo non sempre è d'aiuto perché il disegno della vista potrebbe non essere sempre terminato in questo momento. Un'opzione migliore è quindi inserire il codice in viewWillLayoutSubviews o viewDidLayoutSubviews.

NOTA:viewWillLayoutSubviews o viewDidLayoutSubviews sarà chiamato più volte nel ciclo di vita di una vista, come il cambiamento di orientamento o muoversi dentro e fuori di un'altra vista o qualsiasi variazione cornice per quella materia.
Se il cambio di codice che vuoi inserire qui è un evento singolo, assicurati di utilizzare i flag.

ad esempio: -

- (void)viewWillLayoutSubviews {  
    if(firstTime) { 
     // put your constraint change code here. 
    } 
} 

Spero che questo aiuti! :)

+0

'viewWillAppear' non è un" evento una tantum "se il suddetto controller di visualizzazione si sposta tra l'essere e non il controller di visualizzazione più in alto. Credo che il metodo a cui ti riferisci sia 'viewDidLoad' –

+0

Vero che non si tratta di un" evento singolo ". Potrebbe essere necessario aggiungere il brutto check come in "viewWillLayoutSubviews". 'viewDidLoad' non è pertinente alla domanda in quanto le visualizzazioni secondarie potrebbero non essere necessariamente caricate a quest'ora. Prova tu stesso. – GoGreen

+0

No, sei corretto. La mia risposta è stata più una correzione al tuo commento sul metodo che viene chiamato dopo che la vista del controller della vista è stata caricata rispetto alla domanda iniziale dell'OP. Mie scuse. Hai ragione, però, usare booleani per cose del genere è sempre disgustoso, ma temo che sia una soluzione rapida al problema che l'OP sta avendo. –

0

Non sono sicuro di cosa si stia effettivamente cercando di fare in viewDidLayoutSubviews(). Io uso sempre per personalizzare la vista modificando i valori dei vincoli di layout che sovrascrivono questo metodo.

// Called to notify the view controller that its view has just laid out its subviews 
    override func viewDidLayoutSubviews() { 
     //Write your code here, any constraint modification etc. 
     super.viewDidLayoutSubviews() 
    } 
+0

Perché prima della chiamata a super? – Darko

3

Come suggerisce il nome, viewDidLayoutSubviews viene chiamato quando la vista del tuo viewController ha appena finito la sua posa fuori e si può supporre che a quell'altezza dinamica vostre opinioni sono nella loro corretta luoghi/fotogrammi in base alle vostre vincoli layout automatico.

Swift : 

    override func viewDidLayoutSubviews() { 
     // Set your constraint here 
    } 

Objective C : 

    -(void)viewDidLayoutSubviews { 
    // Set your constraint here 
    } 
+0

puoi dirmi come codificare per sovrascrivere questo metodo in ogg-c? –

+0

@HirenPrajapati: fammi sapere se questo aiuta. –

+0

Sì, questo è esattamente quello che avevo fatto. Funziona bene. Ma non in tutti i casi. Ad esempio, se qualcosa accade come le modifiche alle dimensioni del contenuto della pagina, il layout automatico imposta la cornice delle viste sulle impostazioni di vincolo predefinite. –