我试图动态地居中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 |
| |
--------
非常感谢任何帮助,
非常感谢。
答案 0 :(得分:20)
不确定为什么无法获得内容的大小 - UICollectionView
是UIScrollView
子类,因此可以访问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)