Размещение маржи вокруг каждого края 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
}