UICollectionView间距边距

Mer*_*ert 175 uikit ios uicollectionview

我有一个UICollectionView显示照片.我使用了创建了collectionview UICollectionViewFlowLayout.它工作得很好,但我希望在边距上有间距.是否有可能使用UICollectionViewFlowLayout或必须实现我自己的UICollectionViewLayout

小智 316

您可以使用该collectionView:layout:insetForSectionAtIndex:方法UICollectionView或者设置附加到您sectionInsetUICollectionViewFlowLayout对象的属性UICollectionView:

- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section{
    return UIEdgeInsetsMake(top, left, bottom, right);
}
Run Code Online (Sandbox Code Playgroud)

要么

UICollectionViewFlowLayout *aFlowLayout = [[UICollectionViewFlowLayout alloc] init];
[aFlowLayout setSectionInset:UIEdgeInsetsMake(top, left, bottom, right)];
Run Code Online (Sandbox Code Playgroud)

  • 使用垂直流布局时,我似乎没有得到左右插图... (35认同)
  • 注意:记得将`UICollectionViewDelegateFlowLayout`添加到ViewController委托列表中以使用方法`insetForSectionAtIndex` (3认同)
  • 现在重写 UICollectionViewFlowLayout 子类的sectionInset 方法也没有效果。设置下面描述的属性是有效的。 (2认同)

小智 92

在Interface Builder中设置insets,如下面的屏幕截图所示

为UICollectionView设置部分插入

会导致这样的事情:

具有分段插入的集合视图单元格

  • 很好的答案,只是想指出你还必须玩最小间距,以便插入部分很好. (2认同)

mar*_*mor 75

要在整个 上添加间距UICollectionView:

UICollectionViewFlowLayout *flow = (UICollectionViewFlowLayout*) collection.collectionViewLayout;
flow.sectionInset = UIEdgeInsetsMake(topMargin, left, bottom, right);
Run Code Online (Sandbox Code Playgroud)

要使用同一行的元素之间的间距(如果您是水平滚动,则为列),以及它们的大小:

flow.itemSize = ...;
flow.minimumInteritemSpacing = ...;
Run Code Online (Sandbox Code Playgroud)

  • 这是有效的,但`collection.collectionViewLayout`需要一个演员,如@Pooja示例:`UICollectionViewFlowLayout*flow =(UICollectionViewFlowLayout*)self.collectionViewLayout;` (5认同)

Fel*_*lix 39

只是为了纠正此页面中的一些错误信息:

1- minimumInteritemSpacing:同一行中项目之间使用的最小间距.

默认值:10.0.

(对于垂直滚动网格,此值表示同一行中项目之间的最小间距.)

2- minimumLineSpacing:网格中项目行之间使用的最小间距.

参考:http://developer.apple.com/library/ios/#documentation/uikit/reference/UICollectionViewFlowLayout_class/Reference/Reference.html

  • 这似乎并不影响各节之间的间距,仅影响同一节内的项目之间的间距? (2认同)

Wil*_* Hu 36

斯威夫特4

    let flow = collectionView.collectionViewLayout as! UICollectionViewFlowLayout // If you create collectionView programmatically then just create this flow by UICollectionViewFlowLayout() and init a collectionView by this flow.

    let itemSpacing: CGFloat = 3
    let itemsInOneLine: CGFloat = 3
    flow.sectionInset = UIEdgeInsetsMake(0, 0, 0, 0)
    let width = UIScreen.main.bounds.size.width - itemSpacing * CGFloat(itemsInOneLine - 1) //collectionView.frame.width is the same as  UIScreen.main.bounds.size.width here.
    flow.itemSize = CGSize(width: floor(width/itemsInOneLine), height: width/itemsInOneLine)
    flow.minimumInteritemSpacing = 3
    flow.minimumLineSpacing = 3
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


Jon*_*hon 8

在-Object 上使用setMinimumLineSpacing:和.setMinimumInteritemSpacing:UICollectionViewFlowLayout


fre*_*dpi 8

现代Swift,自动布局计算

虽然这个帖子已经包含了许多有用的答案,但我想根据William Hu的答案添加一个现代的Swift版本.它还改进了两件事:

  • 现在,不同行之间的间距将始终与同一行中项目之间的间距相匹配.
  • 通过设置最小宽度,代码自动计算一行中的项目数,并将该样式应用于流布局.

这是代码:

// Create flow layout
let flow = UICollectionViewFlowLayout()

// Define layout constants
let itemSpacing: CGFloat = 1
let minimumCellWidth: CGFloat = 120
let collectionViewWidth = collectionView!.bounds.size.width

// Calculate other required constants
let itemsInOneLine = CGFloat(Int((collectionViewWidth - CGFloat(Int(collectionViewWidth / minimumCellWidth) - 1) * itemSpacing) / minimumCellWidth))
let width = collectionViewWidth - itemSpacing * (itemsInOneLine - 1)
let cellWidth = floor(width / itemsInOneLine)
let realItemSpacing = itemSpacing + (width / itemsInOneLine - cellWidth) * itemsInOneLine / (itemsInOneLine - 1)

// Apply values
flow.sectionInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
flow.itemSize = CGSize(width: cellWidth, height: cellWidth)
flow.minimumInteritemSpacing = realItemSpacing
flow.minimumLineSpacing = realItemSpacing

// Apply flow layout
collectionView?.setCollectionViewLayout(flow, animated: false)
Run Code Online (Sandbox Code Playgroud)


vme*_*yer 7

使用collectionViewFlowLayout.sectionInset或是collectionView:layout:insetForSectionAtIndex:正确的.

但是,如果您的collectionView有多个部分,并且您想要为整个collectionView添加边距,我建议使用scrollView contentInset:

UIEdgeInsets collectionViewInsets = UIEdgeInsetsMake(50.0, 0.0, 30.0, 0.0);
self.collectionView.contentInset = collectionViewInsets;
self.collectionView.scrollIndicatorInsets = UIEdgeInsetsMake(collectionViewInsets.top, 0, collectionViewInsets.bottom, 0);
Run Code Online (Sandbox Code Playgroud)


小智 5

CollectionItems 之间放置空格使用它

在viewdidload中写这两行

UICollectionViewFlowLayout *collectionViewLayout = (UICollectionViewFlowLayout*)self.collectionView.collectionViewLayout;
collectionViewLayout.sectionInset = UIEdgeInsetsMake(<CGFloat top>, <CGFloat left>, <CGFloat bottom>, <CGFloat right>)
Run Code Online (Sandbox Code Playgroud)


Pin*_*Gjr 5

设置附加到您insetForSectionAtUICollectionViewFlowLayout对象的属性UICollectionView

确保添加此协议

UICollectionViewDelegateFlowLayout
Run Code Online (Sandbox Code Playgroud)

迅速

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
        return UIEdgeInsets (top: top, left: left, bottom: bottom, right: right)
    }
Run Code Online (Sandbox Code Playgroud)

目标-C

- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section{
    return UIEdgeInsetsMake(top, left, bottom, right);
}
Run Code Online (Sandbox Code Playgroud)