2015-11-27 19 views
7

Sto provando a centrare dinamicamente il contenuto di un UICollectionView, tuttavia nessuna delle soluzioni esistenti tiene conto del fatto che potrebbe esserci più di una cella per riga.Come centrare verticalmente il contenuto di UICollectionView

Ho provato questo center custom title in UINavigationBar? così come entrambe le soluzioni qui: UICollectionView vertically Centred, senza alcun risultato.

Sono abbastanza sorpreso che iOS non offre alcun modo di farlo per impostazione predefinita e ancora di più che non è possibile ottenere il numero di righe attualmente visualizzate (che avrebbe risolto anche il mio problema). Inoltre, non riesco a ottenere la dimensione del contenuto (e non semplicemente le dimensioni del fotogramma) che mi avrebbe aiutato a ottenere l'effetto desiderato.

ho questo:

-------- 
|X X X X | 
|X X X X | 
|  | 
|  | 
-------- 

Ma voglio questo:

-------- 
|  | 
|X X X X | 
|X X X X | 
|  | 
-------- 

Qualsiasi aiuto sarebbe molto apprezzato,

Molte grazie.

+1

Non capisco il problema. E cosa intendi con "come ottenere" il numero di righe? Dì alla collezione di visualizzare il numero di articoli, le loro dimensioni, ecc ... – Darko

+0

@Darko: Per centrare un gruppo di celle devo sapere quante file visualizza la vista della collezione (che è diversa dalla numero di elementi in quanto più elementi possono essere visualizzati in fila, a seconda delle dimensioni dello schermo). Una volta ottenuto il numero di celle, posso impostare il margine superiore su (altezza frame frameview - altezza totale occupata dalle celle)/2.Ho aggiunto una rappresentazione visiva alla mia domanda. –

+0

Per quanto riguarda la rappresentazione visiva - se si desidera la versione 2, perché si rende così grande la visualizzazione della raccolta? Basta renderlo più piccolo e centrarlo sullo schermo con il layout automatico. A parte questo (come ha già risposto Jorf) è possibile impostare gli inserti della sezione. Ma a mio parere gli inset sono utili solo se vuoi cambiarlo durante il runtime. Se il layout è stato risolto, riduci la visualizzazione della raccolta. – Darko

risposta

3

Ora capisco il tuo problema. A seconda delle dimensioni dello schermo hai bisogno di un altro riquadro per farlo sembrare centrato. Quindi devi calcolarlo manualmente, ma non dovrebbe essere così difficile. Conoscete lo spazio disponibile, il numero di elementi e la dimensione della cella. Calcola semplicemente la sezione in alto.

0

UICollectionView ha una proprietà visibleCells che restituisce un array. È possibile utilizzare la proprietà count su NSArray per ottenere il numero di celle visibili.

Dovresti essere in grado di implementare - collectionView:layout:insetForSectionAtIndex: nell'implementazione del delegato per impostare l'inset superiore su qualcosa che determinerà il centraggio per cui stai girando.

È inoltre possibile creare sottoclasse UICollectionViewFlowLayout e implementare la propria logica di layout, se necessario.

+0

Vedere il mio secondo commento a Darko sul motivo per cui questa non è una soluzione praticabile. Ciò presuppone che abbia la stessa quantità di celle per ogni riga qualunque sia la dimensione dello schermo. Sebbene tutte le celle siano visibili, non verranno visualizzate su un insieme costante di righe. –

10

Non sono sicuro del motivo per cui non è possibile ottenere la dimensione del contenuto - UICollectionView è una sottoclasse UIScrollView, quindi ha accesso alla proprietà contentSize. Se avete solo bisogno di centrare le cellule nel caso in cui sono tutti visibili senza scorrere, si può semplicemente effettuare le seguenti operazioni:

collectionView.contentInset.top = max((collectionView.frame.height - collectionView.contentSize.height)/2, 0) 

Questo funziona anche nei casi in cui il numero di cellule non cresce in modo che tutti sono visibile sullo schermo e si inizia a utilizzare lo scorrimento verticale: l'inserto superiore verrà impostato su 0.

0

Se si dispone di un TabBar fare questo

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets { 

    let navBarHeight  = self.navigationController?.navigationBar.frame.height 
    let collectionViewHeight = (self.collectionView?.frame.height)! - navBarHeight! 
    let itemsHeight  = self.collectionView?.contentSize.height 

    let topInset = (collectionViewHeight - itemsHeight!)/4 

    return UIEdgeInsetsMake(topInset ,0, 0 , 0) 
} 

Se non ignorare la sottrazione barra delle linguette e lasciare il resto ...

Problemi correlati