swift2 如何将UICollectionView内容垂直居中

jutyujz0  于 2022-11-06  发布在  Swift
关注(0)|答案(6)|浏览(252)

我试图动态地将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 |
|        |
 --------

我们将非常感谢您的帮助,
多谢了。

cfh9epnr

cfh9epnr1#

如果您有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减法并保留其余部分...

cx6n0qe3

cx6n0qe32#

将此添加到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)
pxiryf3j

pxiryf3j3#

不知道为什么你不能得到内容的大小-UICollectionViewUIScrollView的子类,因此可以访问contentSize属性。如果你只需要将单元格居中,以防它们在不滚动的情况下都是可见的,你可以简单地执行以下操作:

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

当单元格的数量增加,以至于不是所有的单元格都在屏幕上可见,并且您开始使用垂直滚动时,这也将起作用-顶部的插入将被设置为0

1l5u6lss

1l5u6lss4#

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

ff29svar

ff29svar5#

这是一个老线索,但我认为最明显的解决方案是缺乏。
我会简单地将UICollectionView放在一个全视图容器中,并将集合视图与自动布局对齐。
UICollectionView应采用最佳大小以适合单元格,然后保持居中。

2jcobegt

2jcobegt6#

UICollectionView具有返回数组的visibleCells属性。您可以使用NSArraycount属性来获取可见单元格的数目。
您应该能够在代理实现中实现- collectionView:layout:insetForSectionAtIndex:,以将顶部插入设置为您所追求的居中效果。
如果需要,您还可以将UICollectionViewFlowLayout子类化并实现自己的布局逻辑。

相关问题