2015-04-29 14 views
9

Ho un CollectionView con 6 sezioni.Posizionamento di due sezioni uno accanto all'altro in un UICollectionView

Le prime sezioni sono organizzate come righe. Sezione 2 & 3 è dove le cose si fanno difficili. Devo posizionare due sezioni una accanto all'altra.

[................ Sezione 1 ..............] // una sezione con un paio di righe
[ ... Sezione 2 ...] [... Sezione 3 ...] // due sezioni al di sotto del primo

Non riesco a dividere la seconda sezione in due colonne perché sono diverse popolate con celle diverse.
Sapendo che il layout del flusso riempie sempre una sezione dai limiti ai limiti, potrei solo simulare un effetto posizionando due celle una accanto all'altra, il che va bene ma aggiungo le celle e posso posizionarne solo una sotto l'altra con un numero intero che aumenta ogni volta che creo una nuova cella in cellForItemAtIndexPath: e la uso per moltiplicarla per l'altezza della cella.

L'unico problema che ho di fronte è quando riutilizzo alcune celle, la variabile intera hack non funziona più.

Quindi c'è un modo migliore per, oltre a un layout personalizzato, che potrebbe non fare il trucco, per posizionare due sezioni una accanto all'altra?

grazie in anticipo

+0

Bene, si potrebbe semplicemente utilizzare due diverse visualizzazioni di scorrimento. Ma è un po 'brutto visto che sta evitando una soluzione più pulita che "usa layout personalizzati e celle personalizzate correttamente" –

+2

I tuoi requisiti sembrano corrispondere all'esempio fornito per un layout personalizzato a pagina 18 di questo documento. https://developer.apple.com/library/ios/documentation/WindowsViews/Conceptual/CollectionViewPGforIOS/CollectionViewPGforIOS.pdf –

+0

Grande! Quindi ho sbagliato ipotizzando che un layout personalizzato non potesse fare il trucco! Grazie – maxlxb

risposta

1

Non devono necessariamente scrivere un layout personalizzato, si può effettivamente solo sottoclasse UICollectionViewFlowLayout e sovrascrivere alcuni metodi chiave che determinano il posizionamento telaio, vale a dire layoutAttributesForElementsInRect:/layoutAttributesForItemAtIndexPath: cui è possibile controllare il sezione e determinare le posizioni.

Il codice stesso probabilmente sarebbe relativamente semplice, qualcosa sulla falsariga di:

if indexPath.section == 0 { 
    attributes.frame = CGRect(x: 0, y: 0, width: fullWidth, height: someHeight) 
} else { 
    // Section 2 which is indexed at 1, set the frame 
    // to half the width and x to 0 
    if indexPath.section %2 != 0 { 
     attributes.frame = CGRect(x: 0, y: someYCounter, width: halfWidth, height, someHeight) 
    } else { 
     attributes.frame = CGRect(x: halfWidth, y: someYCounter, width: halfWidth, height, someHeight) 
    } 
} 

Ovviamente questo è pseudo-codice e non ho eseguito questo attraverso un compilatore, ma i passi essenziali sono:

  • hai dichiarazioni guardia che garantisce l'esistenza di vista raccolta in modo da poter definire le seguenti variabili: halfWidth e fullWidth (da utilizzare quando si posa in un secondo momento)
  • mantenere un contatore esecuzione del y posizione
  • controllo dell'indice sezione e posizionare opportunamente

Il modo migliore per andare su questo è quello di sovrascrivere prepare e calcolare una matrice di layout di attributi (e memorizzare che come un'istanza variabile). Poi nel layoutAttributesForItemAtIndexPath: e simili, appena restituire l'oggetto in corrispondenza dell'indice di tale array (o se l'indice è per qualche motivo fuori limite, ritorno super.layoutAttributesForItem(at: indexPath).

Questa è la bellezza della UICollectionViewFlowLayout, la maggior parte del lavoro è fatto per te e puoi sottoclassi alcuni semplici metodi per ottenere il comportamento desiderato.L'alternativa è un layout personalizzato completo che, a mio parere, raramente è giustificato a meno che non si abbia un comportamento pazzo, nel qual caso si dovrebbero conversare con i progettisti sulla complessità di ciò che fanno.

+0

Grazie per il tuo commento. Sembra un approccio più semplicistico che richiede solo modifiche al layout, che ridurrebbe drasticamente l'implementazione 'cellForItemAtIndexPath:' così come l'implementazione complessiva di viewController e non mi richiederebbe di implementare un layout personalizzato che fosse il punto centrale di questa domanda e quindi ho accettato la risposta. – maxlxb

Problemi correlati