2009-07-25 25 views
43

Quando e come viene utilizzato layoutIfNeeded? So che quando cambiamo il layout di una vista, possiamo chiamare setNeedsLayout per aggiornare il layout, ma non sono sicuro che sia necessario utilizzare layoutIfNeeded.Come si usa layoutIfNeeded?

NOTA: ho il codice layoutIfNeeded utilizzato nel codice reale ma ho dimenticato in quale contesto è stato utilizzato.

risposta

57

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:

  1. 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.
  2. Un oggetto controller chiede alla visualizzazione tabella di scorrere verso una determinata cella quando gestisce un evento utente.
  3. 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.

-9

setNeedsLayout chiama effettivamente layoutIfNeeded, quindi se la tua chiamata setNeedsDisplay non c'è motivo di chiamare layoutIfNeeded. In questo modo setNeedsLayout è un metodo comodo per chiamare layoutIfNeeded che fa il sollevamento pesante.

+14

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

+1

dang, quale importante downvote –