2013-06-05 4 views
18

Wenn die UICollectionView mit Elementen gefüllt ist, sie zu den Rändern des UICollectionView gehen Sie nach rechts immer etwa so:einen Rand um jede Kante des UICollectionView Platzierung

--------------- 
|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| 
--------------- 

ich um jede Kante einen Rand platzieren möchte wie so:

--------------- 
| 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 | 
--------------- 

ich versuchte, dies zu erreichen, indem die UICollectionView innerhalb seines Hosting-UIView Platzierung durch seinen Rahmen Einstellen eine Grenze zu simulieren, aber es rollt im Rahmen so an dem Ober- und Unterseite und das Stellrad abgeschnitten auch wird angezeigt in den Grenzen des Rahmens.

Ich habe die API angeschaut, aber ich kann nichts Offensichtliches sehen, um dies zu erreichen. Irgendwelche Ideen?

Antwort

6

In

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

Sie Ihre Zellen einen gewissen Spielraum auf der linken Seite geben kann.

Oder Sie können benutzerdefinierte Zellen schaffen, die einen Spielraum haben.

oder Sie können die Eigenschaft .sectionInset Ihrer CollectionviewFlowLayout gesetzt, was der einfachste Weg sein sollte (wenn Sie Flowlayout verwenden)

10

Sie können mit dem collectionview-Protokoll so gut wie jeden Aspekt des Grids kontrollieren. Hier ein Beispiel:

- (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; 
} 

Die Sie wollen würde in Ihrem Fall ändern, ist die sectionInsets

15

Sie Verwendung der folgenden Funktion machen kann.

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

Sie müssen mit der Nummer spielen, um herauszufinden, wie der collectionviewCells in einer einzigen Zeile zu erzwingen.

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

Für Swift 3

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

Dies ist meine Lieblingslösung hier - es ist viel weniger hacky als die Zellen auffüllen. Und das contentInset funktioniert nicht immer für mich. –

+1

Wie man dies in Swift @Vinayak Kini –

38

Ich weiß, dass dies eine alte Frage, aber vergessen Sie nicht, dass UICollectionView von UIScrollView erbt.

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) 

Beachten Sie, dass beide contentInset und sectionInset kann den Abstand der Zellen in der Ansicht ändern. Weitere Informationen über das finden this Post.

+1

'collectionView.contentInset' ist, was ich brauchte. Vielen Dank – Ali

3

Swift 2.0

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

Auf Xcode 8, wenn Sie den Interface Builder verwenden Sie den Abschnitt Insets direkt am Größe Inspector einstellen:

enter image description here

enter image description here

0

Swift 3 Version (Vinayak Kini Antwort):

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

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