2013-06-20 17 views
19

Ho una schermata intera UICollectionView nella mia app. Scorre orizzontalmente e ogni cella riempie i limiti della vista dell'insieme. La vista raccolta è gestita da un UIViewController.UIViewController all'interno di UICollectionView

Dato che ogni "pagina" è ragionevolmente complessa, ha senso che ogni pagina stessa sia gestita da un associato UIViewController. iOS 5 supporta il contenimento del controller di visualizzazione, in modo che i controllori figlio ricevano i metodi del ciclo di vita appropriati (ad esempio viewWillAppear:, ecc.) quando le viste sono collegate e separate. Quanto sarebbe bello giocare con il riciclaggio delle immagini?

Scorrendo dalla pagina "1", a "2", verrà creata una nuova vista (poiché entrambe potrebbero essere visualizzate contemporaneamente durante il touchdown). Passando dalla pagina "2" a "3", lo UICollectionView potrebbe rimuovere la vista dalla pagina "1", ma cosa succede ora? Inserirò forzatamente la vista nel controller di visualizzazione tre in questo modo?

id cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"ident" forIndexPath:indexPath]; 
UIViewController *child_controller = [self controllerAtIndexPath:indexPath]; 
[child_controller setView:cell]; 
// ... and so on 

Questo sembra sbagliato. Tuttavia, non riesco a pensare a un modo corretto di riutilizzare le viste correttamente in questa istanza. Sto prendendo completamente l'approccio sbagliato?

+8

Se ogni cella riempie i limiti della vista dell'insieme, perché non usare semplicemente un 'UIPageViewController' con il suo' transitionStyle' impostato su 'UIPageViewControllerTransitionStyleScroll'? È progettato per ospitare un controller di visualizzazione figlio per pagina. –

risposta

8

Non penso che UICollectionView sia la scelta migliore per l'attività.
Come rob mayoff ha detto: è possibile utilizzare UIPageViewController.
Un'altra opzione può essere utilizzando UIScrollView con 3 subviews (precedente, corrente, successivo). E sarai in grado di gestire facilmente la sua posizione e scorrere l'offset della vista per ottenere l'effetto desiderato.
Questo è descritto nel WWDC 2011 'Advanced Scrollview Techniques'. Puoi prendere il codice sorgente da lì.

+0

Sono completamente d'accordo con Sergey: questo compito è ciò per cui UIPageViewController è stato creato. – MrTJ

+0

@Sergey Kuryanov, mi trovo nella stessa situazione ma affronta problemi di memoria in UIPageViewController, qualsiasi aiuto tu possa fornire per risolvere problemi di memoria. Sto usando l'arco – DAMM108

+0

Forse stai provando a salvare troppi VC allo stesso tempo. È difficile rilevare il problema senza codice reale. –

7

Ho fatto la stessa cosa, ma con due controller di visualizzazione visibili in una sola volta e riordinabili, quindi una vista di raccolta era la scelta giusta.

Si è scoperto che la rimozione della vista precedente del controller di visualizzazione e l'aggiunta di una nuova ha causato un notevole impatto sulle prestazioni durante lo scorrimento, con la rimozione della vista come il metodo più lento.

Il riutilizzo di celle ha senso solo se il nuovo uso della cella è simile, ma diverso - ad es. stai cambiando il testo di un'etichetta o inserendo un'immagine diversa in una vista dell'immagine. Se stai rippando e sostituendo l'intera gerarchia della vista, non stai davvero riutilizzando la cella.

Quello che ho dovuto fare è stato utilizzare nuove celle per ogni controller di visualizzazione che potrebbe essere contenuto. Nel mio caso c'era un limite al numero di celle che significava che non c'era davvero un problema con il consumo di memoria che aveva molti controller di vista in gioco in una sola volta.

Quindi, in poche parole, non riutilizzare le celle. È più costoso che mantenere i vecchi in giro. Scorrere verso il basso di una tabella di cento righe è diverso dallo scorrere su alcune visualizzazioni a schermo intero. Ma, dato che i tuoi sono a schermo intero, una visualizzazione a scorrimento potrebbe essere un'opzione migliore.

+0

Sto facendo esattamente la stessa cosa in questo momento (i bordi degli altri vc sono visibili, a la ricerca della app store risultati). Hai altri problemi a cui ti sei imbattuto o puntatori? –

+1

L'unica cosa che ho trovato utile era che tutti i controller di vista figlio adottassero un protocollo che permettesse al controllore della vista di raccolta di dire loro quando si muovevano su e fuori dallo schermo - e lì, si farebbe il viewDidApparire/sparire roba, che altrimenti non verrebbero richiamati, poiché le visualizzazioni venivano visualizzate solo una volta. – jrturton

+0

Buono a sapersi. Grazie. –

7

Probabilmente è preferibile utilizzare sottoclassi UIView (o sottoclassi UICollectionViewCell) anziché UIViewControllers incapsulato. Gli UIViewControllers incapsulati devono avere conoscenza del proprio controller di visualizzazione genitore, che potrebbe causare problemi con la manutenibilità del codice.

La complessità non significa automaticamente che si dovrebbe prendere in considerazione l'adozione di UIViewController. Anche l'UIViews può essere abbastanza complesso. Il ruolo di un UIViewController è davvero quello di fornire incapsulamento e ciclo di vita aggiuntivi che non sembrano necessari.

Come altri hanno già detto, UIPageViewController sembra una buona alternativa, ma non conosco le specifiche della situazione.

Problemi correlati