如何垂直居中UICollectionView内容

时间:2015-11-27 16:37:52

标签: ios swift swift2

我试图动态地居中UICollectionView的内容,但是现有的解决方案都没有考虑到每行可能有多个单元格的事实。

我在这里尝试了这个center custom title in UINavigationBar?以及两个解决方案:UICollectionView vertically Centred,但无济于事。

我很惊讶iOS在默认情况下无法做到这一点,甚至更多的是无法获得当前显示的行数(这也解决了我的问题)。此外,我无法获得内容的大小(而不仅仅是框架的大小),这也有助于我达到预期的效果。

我有这个:

 --------
|X X X X |
|X X X X |
|        |
|        |
 --------

但我想要这个:

 --------
|        |
|X X X X |
|X X X X |
|        |
 --------

非常感谢任何帮助,

非常感谢。

5 个答案:

答案 0 :(得分:20)

不确定为什么无法获得内容的大小 - UICollectionViewUIScrollView子类,因此可以访问contentSize属性。如果您只需将单元格置于中心位置以防其全部可见而无需滚动,则只需执行以下操作:

collectionView.contentInset.top = max((collectionView.frame.height - collectionView.contentSize.height) / 2, 0)

这也适用于单元格数量增长的情况,以至于并非所有单元格都在屏幕上可见,并且您开始使用垂直滚动 - 顶部插入将设置为0

答案 1 :(得分:3)

现在我理解你的问题了。根据屏幕尺寸的不同,您需要另外插入以使其看起来居中。然后你必须手动计算它,但它不应该那么难。您知道可用空间,项目数和单元格大小。只需从顶部计算插入部分。

答案 2 :(得分:0)

count具有返回数组的visibleCells属性。您可以使用NSArray上的UICollectionViewFlowLayout属性来获取可见单元格的数量。

您应该能够在代理实现中实施 - collectionView:layout:insetForSectionAtIndex:,将顶部插图设置为导致您正在拍摄中心的内容。

如果需要,您还可以将{{1}}子类化并实现自己的布局逻辑。

答案 3 :(得分:0)

如果您有tabBar,请执行此操作

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

    let navBarHeight       = self.navigationController?.navigationBar.frame.height
    let collectionViewHeight = (self.collectionView?.frame.height)! - navBarHeight!
    let itemsHeight        = self.collectionView?.contentSize.height

    let topInset = ( collectionViewHeight - itemsHeight! ) / 4

    return UIEdgeInsetsMake(topInset ,0, 0 , 0)
}

如果不忽略tabBar减法并留下其余的......

答案 4 :(得分:0)

viewDidLoad

中添加它
let viewHeight: CGFloat = view.center.y
let contentHeight: CGFloat = collectionView.contentSize.height
let marginHeight: CGFloat = (viewHeight - contentHeight) / 2.0
self.collectionView.contentInset = UIEdgeInsets(top: marginHeight, left: 0, bottom:  0, right: 0)