7

Ho creato un'applicazione basata su pagine e l'ho hackerata un po 'per alcuni esperimenti; il mio semplice obiettivo è avere un UIPageViewController le cui pagine conterranno un UIViewController che tiene un UITableView (dopo un'ulteriore ispezione, il risultato del mio esperimento è lo stesso se uso un UITableViewController). Per fare questo ho semplicemente modificato il modello di progetto, e ha aggiunto l'UIPageViewController come una vista incorporata del RootViewController usando oggetto ContainerView di Storyboard, come si può vedere in questo screenshot:Perché gli insiemi di contenuto di un UITableView all'interno di un UIPageViewController diventano confusi subito dopo un'interazione?

storyboard's controllers

Ogni controller è configurato tramite storyboard per regolare automaticamente la visualizzazione del contenuto della vista di scorrimento, e se avvio il progetto con questa configurazione tutto sembra a posto, e la vista tabella di DataViewController ha i suoi inserti di contenuto correttamente regolati proprio sotto la barra di navigazione come previsto; tuttavia, come l'utente effettua un'interazione con il Tableview, gli inserti di contenuti si rompono e il Tableview mancati passaggi barra di navigazione:

content inset issue with uipageviewcontroller and a tableview

sono stato in grado di risolvere questo problema impostando manualmente gli inserti contenuti nel metodo viewDidLayoutSubview di DataViewController e disabilitando Regola gli angoli della vista di scorrimento su qualsiasi controller, quindi non ho bisogno di questa soluzione come risposta per risolvere il mio problema. La mia domanda è il motivo per cui gli insiemi di contenuti sono impostati correttamente appena il primo controller viene caricato dallo storyboard la prima volta e perché si interrompono dopo qualsiasi tipo di interazione dell'utente.

Se hai bisogno di testare direttamente, here 'un collegamento al progetto

risposta

14

io non sono sicuro al 100% è quello che si sta eseguendo in, ma ecco qualche spiegazione per quanto riguarda la configurazione:

Per impostazione predefinita, UIViewController tendono ad essere configurati per estendere il loro contenuto dietro barre non opache e per regolare gli inserti di visualizzazione a scorrimento. Nella configurazione sopra questo significa che il VC contenitore:

  • Estende il suo contenuto in modo da apparire dietro la barra di navigazione
  • Imposta di .contentInset sua ScrollView e .scrollIndicatorInsets di essere alla stessa altezza della barra di navigazione

"Ma, ah!" Ho sentito dire che "il controller della vista contenitore non ha una vista di scorrimento". Beh, questo è un po 'complicato:

Sembra che la definizione di "mia vista di scorrimento" sia UIViewController's piuttosto semplicisticamente, "la prima vista di scorrimento a cui arrivo quando scruto attraverso la mia gerarchia di vista".

UIPageViewController sembra essere implementato utilizzando una vista di scorrimento. Quindi il contenitore VC trova quella vista di scorrimento e regola i suoi margini superiori. Questo non è proprio quello che vuoi; confonde il controller di pagina e tende ad alterare il layout ad un certo punto.

La soluzione semplice è semplicemente disattivare .automaticallyAdjustsScrollViewInsets per il controller di visualizzazione contenitore.

È quindi necessario risolvere il problema successivo della vista tabella che richiede una sorta di inserti principali per tenere conto della barra di navigazione. Finora mi sembra che il modo migliore per farlo sia manualmente nello storyboard o nel codice.

+0

Wow mi sono imbattuto nello stesso problema ESATTO e l'ho cercato disperatamente su di esso (pensando che non avrei mai trovato una risposta dato che devo aver fatto un errore stupido) ma eccoti qui, salvatore! Grazie – Starscream

+0

Grazie Mike, è esattamente quello di cui avevo bisogno !! –

0

Hai provato che fissa il vincolo Auto Layout nella vista contenitore del controller della vista Root nella Storyboard (cioè lo spazio in alto il vincolo deve essere impostato in relazione alla Guida al layout principale e non al Superview, con costante = 0)? Si perde solo l'effetto della Table View scorrimento sotto la barra di navigazione

+0

Il problema è che non posso perdere quell'effetto a causa di ign decisioni. –

+0

E comunque, ho trovato un modo per risolverlo, mi domanda è perché sta succedendo? –

7

Trovato una soluzione elegante:

  1. Dal tuo storyboard, selezionare il UIPageViewController
  2. In Attributi, deselezionare l'opzione ViewController =>Extend Edges =>Under Top Bars
  3. Questo è tutto, non è strano UI hack
+0

questo è l'assassino! Molte grazie – epolyakov

+0

Sì, questa era la soluzione corretta per me. L'utilizzo di automaticAdjustsScrollViewInsets non ha funzionato. Nel mio caso, ho avuto un UIPageViewController all'interno di un controller di navigazione. UIPageViewController ha creato UICollectionViewController per ogni pagina. Setting automaticallyAdjustsScrollViewInsets = false ha causato il push della pagina. automaticallyAdjustsScrollViewInsets = true ha causato il salto della pagina quando la pagina iniziava a scorrere. – blinkmacalahan