layoutIfNeeded
obbliga il destinatario a impaginare immediatamente le sue sottoview se necessario.
Supponiamo di aver sostituito layoutSubviews
e Uikit ritiene che la visualizzazione richieda layout per qualsiasi motivo (ad esempio, si è chiamato setNeedsLayout
quando si gestisce un'azione dell'utente). Quindi, il metodo personalizzato layoutSubviews
verrà chiamato immediatamente anziché quando verrà normalmente chiamato nella normale sequenza di eventi ciclo di esecuzione UIKit (dopo la gestione degli eventi, ma prima di drawRect:
).
Un esempio del motivo per cui si potrebbe aver bisogno di chiamare layoutIfNeeded
all'interno di un singolo ciclo di esecuzione:
- si ridimensiona una visualizzazione personalizzata che contiene una visualizzazione della tabella con un layout personalizzato.
setNeedsLayout
viene impostato in modo che layoutSubviews
venga chiamato in seguito.
- Un oggetto controller chiede alla visualizzazione tabella di scorrere verso una determinata cella quando gestisce un evento utente.
- La visualizzazione personalizzata esegue alcune ridimensionazioni personalizzate della vista tabella in
layoutSubviews
che modifica la dimensione della vista tabella.
Il problema si verifica quando il controller ha chiesto alla visualizzazione tabella di scorrere (passaggio 2), la vista tabella aveva limiti stantii. I limiti aggiornati verranno impostati solo in seguito nella tabella (passaggio 3). Ciò che il controllore voleva che la vista tabella scorresse potrebbe non essere visibile dopo lo layoutSubviews
. Una soluzione sarebbe quindi che il controller chiami layoutIfNeeded
in situazioni in cui sa che ciò potrebbe accadere.
fonte
2010-09-24 08:32:10
Questo non è vero. setNeedsLayout contrassegna la vista per il layout, il che comporterà la convocazione di layoutsubviews su un altro ciclo di runloop. Se si chiama layoutIfNeeded, le immagini di layout vengono richiamate nello stesso ciclo di runloop. Per testare questo set un punto di interruzione in layoutSubviews e quindi un punto di interruzione su una chiamata a setNeedsLayout. Se avanzi di una riga, noterai che non si interrompe in layoutSubviews. Tuttavia, se si interrompe su layoutIfNeeded e si anticipa una linea, si noterà che si interromperà in layoutSubview prima di avanzare. – tyler
dang, quale importante downvote –