如何垂直居中UICollectionView内容

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

我在UINavigationBar中尝试过这个中心自定义标题? 以及这里的两个解决方案: UICollectionView垂直居中 ,无济于事。

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

我有这个:

-------- |XXXX | |XXXX | | | | | -------- 

但我想要这个:

  -------- | | |XXXX | |XXXX | | | -------- 

任何帮助将不胜感激,

非常感谢。

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

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

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

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

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

您应该能够实现- collectionView:layout:insetForSectionAtIndex:在您的委托实现中将顶部插入设置为将导致您正在拍摄的居中的内容。

您还可以子类化UICollectionViewFlowLayout并在必要时实现您自己的布局逻辑。

如果您有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减法并留下其余的…