2013-06-05 8 views
18

Quando l'UICollectionView è popolato con oggetti che vanno sempre fino ai bordi del UICollectionView modo:Posizionando un margine intorno ogni bordo del UICollectionView

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

Vorrei inserire un margine intorno ogni lato come così:

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

ho cercato di realizzare questo mettendo l'UICollectionView all'interno del suo UIView ospitare impostando il suo frame per simulare un bordo ma scorre all'interno del telaio in modo viene tagliata nella parte superiore e inferiore e lo scroller appare anche nei limiti della cornice.

Ho esaminato l'API ma non riesco a vedere nulla di ovvio per raggiungere questo obiettivo. Qualche idea?

risposta

6

In

(UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath { 
} 

potete dare le vostre cellule certo margine sul lato sinistro.

Oppure è possibile creare celle personalizzate, che hanno un margine.

oppure è possibile impostare la proprietà .sectionInset del CollectionviewFlowLayout, che dovrebbe essere il modo più semplice (se si utilizza FlowLayout)

10

Puoi praticamente controllare ogni aspetto della griglia con il protocollo di collectionview. Ecco un esempio:

- (UICollectionViewFlowLayout *)collectionViewFlowLayout 
{ 
    UICollectionViewFlowLayout *flowLayout = [UICollectionViewFlowLayout new]; 
    flowLayout.itemSize = CGSizeMake(180, 255); 
    flowLayout.sectionInset = UIEdgeInsetsMake(10, 30, 0, 30); 
    flowLayout.minimumInteritemSpacing = 0.0f; 
    flowLayout.minimumLineSpacing = 0.0f; 
    flowLayout.scrollDirection = UICollectionViewScrollDirectionVertical; 
    return flowLayout; 
} 

Quello che si vorrebbe cambiare nel tuo caso è la sectionInsets

15

È possibile utilizzare la seguente funzione.

- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section 
    { 
     return UIEdgeInsetsMake(50, 50,15,50); 
    } 

Dovrai giocare con il numero per capire come forzare il collectionviewCells in una singola riga.

UIEdgeInsetsMake (CGFloat top,CGFloat left,CGFloat bottom,CGFloat right); 

Per Swift 3

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets { 
    return UIEdgeInsetsMake(10, 4, 10, 4) 
} 
+0

Questa è la mia soluzione preferita qui - è molto meno hacky rispetto al riempimento delle celle. E contentInset non sempre funziona per me. –

+1

Come rendere questo in swift @Vinayak Kini –

38

So che questa è una vecchia questione, ma non dimenticate che UICollectionView eredita da UIScrollView.

UICollectionView *collectionView = [[UICollectionView alloc] init]; 
collectionView.contentInset = UIEdgeInsetsMake(x.x, x.x, x.x, x.x); 
// Swift 3 for good measure 
let collectionView = UICollectionView() 
collectionView.contentInset = UIEdgeInsets(top: x.x, left: x.x, bottom: x.x, right: x.x) 

essere consapevoli del fatto che sia contentInset e sectionInset possono modificare la spaziatura delle celle nella vista. Per maggiori informazioni su questo, vedi il post this.

+1

'collectionView.contentInset' è quello di cui avevo bisogno. Grazie – Ali

3

Swift 2.0

self.automaticallyAdjustsScrollViewInsets = false 
self.collectionView.contentInset = UIEdgeInsets(top: 10, left: 0, bottom: 0, right: 0) 
1

Su Xcode 8, se si sta utilizzando il costruttore di interfaccia è possibile impostare il diritto Sezione Insets sul Ispettore Dimensione:

enter image description here

enter image description here

0

Swift 3 versione (Vinayak Kini risposta):

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

    return UIEdgeInsetsMake(10, 10, 10, 10) //top, left, bottom, right 
} 
Problemi correlati