So che la catena di layout automatico consiste sostanzialmente in 3 processi diversi.
- vincoli di aggiornamento
- viste di layout (qui è dove otteniamo il calcolo dei frame)
- Schermo
Ciò che non è del tutto chiaro per me è la differenza interiore tra -setNeedsLayout
e -setNeedsUpdateConstraints
. Da Apple Docs:
Chiama questo metodo sul thread principale dell'applicazione quando desideri regolare il layout delle viste secondarie di una vista. Questo metodo prende nota della richiesta e restituisce immediatamente. Poiché questo metodo non impone un aggiornamento immediato, ma attende invece il ciclo di aggiornamento successivo, è possibile utilizzarlo per invalidare il layout di più viste prima che una di tali viste venga aggiornata. Questo comportamento consente di consolidare tutti gli aggiornamenti del layout in un ciclo di aggiornamento, che di solito è migliore per le prestazioni.
Quando una proprietà della vista personalizzata cambia in modo tale da influire sui vincoli, è possibile chiamare questo metodo per indicare che i vincoli dovranno essere aggiornati in futuro. Il sistema chiamerà quindi updateConstraints come parte del suo normale passaggio di layout. L'aggiornamento dei vincoli in una sola volta, appena prima che siano necessari, garantisce che non sia necessario ricalcolare inutilmente i vincoli quando vengono apportate più modifiche alla vista tra passaggi del layout.
Quando voglio animare una vista dopo aver modificato un vincolo e animare le modifiche che di solito chiamo per esempio:
[UIView animateWithDuration:1.0f delay:0.0f usingSpringWithDamping:0.5f initialSpringVelocity:1 options:UIViewAnimationOptionCurveEaseInOut animations:^{
[self.modifConstrView setNeedsUpdateConstraints];
[self.modifConstrView layoutIfNeeded];
} completion:NULL];
Ho scoperto che se uso -setNeedsLayout
invece di -setNeedsUpdateConstraints
tutto funziona come previsto, ma se cambio -layoutIfNeeded
con -updateConstraintsIfNeeded
, l'animazione non avverrà.
Ho cercato di trarre le mie conclusioni:
-updateConstraintsIfNeeded
aggiorna solo i vincoli ma non impone al layout di entrare nel processo, quindi i frame originali vengono comunque conservati-setNeedsLayout
chiama anche-updateContraints
metodo
Quindi, quando va bene usare l'uno invece dell'altro? e riguardo ai metodi di layout, devo chiamarli sulla vista che ha una modifica in un vincolo o sulla vista padre?