21

当 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 设置为模拟边框,但它在 Frame 内滚动,因此在顶部和底部被切断,并且滚动条也出现在框架的边界中。

我已经查看了 API,但我看不到任何明显的实现这一点。有任何想法吗?

4

7 回答 7

42

我知道这是一个老问题,但不要忘记 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 都可能会更改视图中单元格的间距。有关这方面的更多信息,请参阅这篇文章。

于 2014-04-02T21:11:43.370 回答
15

您可以使用以下功能。

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

对于斯威夫特 3

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
    return UIEdgeInsetsMake(10, 4, 10, 4)
}
于 2013-06-05T08:31:14.017 回答
9

您几乎可以使用 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

于 2013-06-05T08:22:08.093 回答
7

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

您可以在左侧为单元格留出一些边距。

或者您可以创建具有边距的自定义单元格。

或者您可以设置您的 .sectionInset 属性,CollectionviewFlowLayout应该是最简单的方法(如果您使用 FlowLayout)

于 2013-06-05T08:26:24.820 回答
3

斯威夫特 2.0

self.automaticallyAdjustsScrollViewInsets = false
self.collectionView.contentInset = UIEdgeInsets(top: 10, left: 0, bottom: 0, right: 0)
于 2016-04-28T21:20:14.443 回答
1

在 Xcode 8 上,如果您使用界面构建器,您可以在 Size Inspector 上设置 Section Insets:

在此处输入图像描述

在此处输入图像描述

于 2017-03-10T13:00:16.830 回答
1

Swift 4 更新Vinayak Kini回答):

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
    return UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
}
于 2017-06-14T11:50:29.930 回答