2014-06-19 8 views
6

Ho un controller contenitore che visualizza una barra di dati proprio sotto la guida di layout lop.È possibile impostare gli inserti di visualizzazione a scorrimento per i controller contenitore?

Voglio che il controller figlio di questo controller contenitore sia in grado di scorrere dietro questa barra così come qualsiasi barra di navigazione e barra di stato. Tuttavia sembra che quando UIKit regola automaticamente gli insiemi di visualizzazione a scorrimento di un controller tiene conto solo della lunghezza della guida di layout superiore.

C'è un modo per dire che gli insiemi di visualizzazione di scorrimento dovrebbero essere la guida di layout superiore + l'altezza della mia barra? So che le persone suggeriranno di impostare automaticallyAdjustsScrollViewInsets = NO ma l'ho già provato. Il problema è che non riesco a replicare esattamente quando UIKit imposta gli insiemi di contenuto e così ottengo tutti i tipi di casi limite che infrangono gli inset. L'esempio più importante è UITableViewController dove, poiché imposto manualmente gli insiemi di contenuti, il controllo di aggiornamento a volte non è nella posizione corretta e quando termino l'aggiornamento degli insiemi della vista di scorrimento viene impostato su {0, 0} in modo che il contenuto sia nascosto dietro il mio bar e la barra di navigazione.

UPDATE: Tutta la magia sembra essere all'interno dei metodi _setNavigationControllerContentInsetAdjustment su UIViewController e _computeAndApplyScrollContentInsetDeltaForViewController su UINavigationController.

Sembra che solo il controller di navigazione tenti di regolare gli inserti della vista a scorrimento e calcola gli inserti in base alle guide di layout in alto e in basso. Passa questi insiemi sul controller della vista che quindi aggiunge/sottrae gli insiemi dalla vista di scorrimento e prende in considerazione quali insiemi di contenuto di navigazione sono stati impostati in precedenza. Ciò garantisce che se qualcun altro ha modificato gli insiemi di contenuti da ora a oggi e quando il controller di navigazione ha modificato per ultimi gli inset non ignorerà le modifiche intermedie.

risposta

2

La mia soluzione era impostare automaticallyAdjustsScrollViewInsets = NO e gestire personalmente le impostazioni dei contenuti.

Ho creato un category su UIViewController che monitorava gli eventuali riquadri esistenti impostati in modo tale che ogni volta che ho regolato i riquadri per far apparire la vista di scorrimento sotto il mio UIView personalizzato non perderei alcuna informazione, come il contenuto inserito per UITableViewController con un controllo di aggiornamento attivo al suo interno.

Dopo che l'ultima sfida era capire dove impostare gli inserti personalizzati e dopo molti esperimenti ho trovato che - (void)viewDidLayoutSubviews era il posto migliore per farlo.

FDScrollingTabBarController è il controller contenitore in cui ho implementato questa soluzione.

Problemi correlati