Размещение маржи вокруг каждого края UICollectionView

Когда UICollectionView заполняется элементами, они всегда идут прямо к краям 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|
---------------

Я хотел бы поместить маркер вокруг каждого края так:

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

Я попытался добиться этого, разместив UICollectionView внутри своего хостинга UIView, установив его Frame для имитации границы, но он прокручивается внутри рамки, поэтому он обрезается сверху и снизу, а скроллер также появляется в границах кадра.

Я просмотрел API, но я не вижу ничего очевидного для достижения этого. Любые идеи?

Ответы

Ответ 1

В

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

вы можете дать вашим ячейкам некоторый запас с левой стороны.

Или вы можете создавать пользовательские ячейки с запасом.

или вы можете установить свойство .sectionInset вашего CollectionviewFlowLayout, что должно быть самым простым способом (если вы используете FlowLayout)

Ответ 2

Я знаю, что это старый вопрос, но не забывайте, что UICollectionView наследуется от 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)

Помните, что как contentInset, так и sectionInset могут изменять интервал ячеек в вашем представлении. Для получения дополнительной информации об этом см. эту статью.

Ответ 3

Вы можете использовать следующую функцию.

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

Вам придется поиграть с номером, чтобы выяснить, как заставить collectionviewCells в одной строке.

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

Для Swift 3

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

Ответ 4

Вы можете контролировать все аспекты сетки с помощью протокола collectionview. Вот пример:

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

Тот, который вы хотите изменить в своем случае, это sectionInsets

Ответ 5

Swift 2.0

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

Ответ 6

В Xcode 8, если вы используете построитель интерфейсов, вы можете установить вставки разделов прямо на Инспекторе размеров:

введите описание изображения здесь

введите описание изображения здесь

Ответ 7

версия Swift 3 (ответ Vinayak Kini):

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

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