2013-06-05 5 views
18

Gdy UICollectionView jest wypełniona przedmiotów zawsze iść w prawo do krawędzi UICollectionView tak:Umieszczanie marginesu wokół każdej krawędzi 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| 
--------------- 

Chciałbym umieścić margines wokół każdej krawędzi podobnego tak:

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

starałem się to osiągnąć poprzez umieszczenie UICollectionView wewnątrz jej hosting UIView przez ustawienie jej ramkę, aby symulować granicę, ale przewija się w ramach tak zostanie odcięty na górze i na dole i wydaje również scroller w granicach kadru.

Sprawdziłem interfejs API, ale nie widzę niczego oczywistego, aby to osiągnąć. Jakieś pomysły?

Odpowiedz

6

W

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

można dać komórek pewien margines po lewej stronie.

Można również utworzyć komórki niestandardowe z marginesem.

lub można ustawić właściwość .sectionInset swojego CollectionviewFlowLayout, który powinien być najprostszym sposobem (jeśli używasz FlowLayout)

10

Możesz praktycznie kontrolować każdy aspekt siatki za pomocą protokołu collectionview. Oto przykład:

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

Jedno, co chcesz zmienić w twoim przypadku jest sectionInsets

15

można skorzystać z następujących funkcji.

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

Będziesz musiał się bawić z numerem, aby dowiedzieć się, jak wymusić collectionviewCells w jednym wierszu.

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

Dla Swift 3

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

To moje ulubione rozwiązanie - jest o wiele mniej hackowate niż podbieranie komórek. A contentInset nie zawsze działa dla mnie. –

+1

Jak zrobić to w szybkim @Vinayak Kini –

38

wiem, że to jest stare pytanie, ale nie zapominaj, że UICollectionView dziedziczy od 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) 

Należy pamiętać, że zarówno contentInset i sectionInset może zmienić odstępy komórek w widoku. Więcej informacji na ten temat można znaleźć w poście this.

+1

'collectionView.contentInset' jest tym, czego potrzebowałem. Dzięki – Ali

3

Swift 2.0

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

Na Xcode 8, jeśli używasz konstruktora interfejsu można ustawić prawej części wypustki na inspektora Rozmiar:

enter image description here

enter image description here

0

Swift 3 wersja (Vinayak Kini odpowiedź):

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

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