2015-11-27 149 views
7

我想动态地集中一个UICollectionView的内容,但是现有的解决方案都没有考虑到每行可能有多个单元的事实。如何垂直中心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 | 
|  | 
-------- 

任何帮助将不胜感激,

非常感谢。

+1

我不明白你的问题。如何“获取”行数是什么意思?你告诉集合视图的项目数量,它们的大小等... – Darko

+0

@Darko:为了集中一组单元格,我需要能够知道集合视图显示了多少行(这与根据屏幕大小,可以连续显示多个项目的项目数量)。一旦我有了单元格的数量,我可以将顶部插入设置为(collectionview框架高度 - 单元格占用的总高度)/ 2。我已经为我的问题添加了一个可视化表示。 –

+0

关于你的视觉表现 - 如果你想要第2版,为什么你要让收藏视图如此之大?只需将其缩小并使用自动布局将其居中在屏幕中即可。除此之外(如jorf已经回答)您可以设置节插页。但在我看来,插入仅在运行时需要更改时才有用。如果布局是固定的,那么只需要缩小收集视图。 – Darko

回答

3

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

0

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

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

您也可以继承UICollectionViewFlowLayout并根据需要实现您自己的布局逻辑。

+0

看到我对Darko的第二个评论,为什么这不是一个可行的解决方案。这假定我无论屏幕大小如何都具有相同数量的单元格。尽管所有单元格都是可见的,但它们不会显示在一组常数行上。 –

10

不确定为什么你不能得到内容的大小 - UICollectionViewUIScrollView的子类,因此有权访问contentSize属性。如果你只需要到中心的细胞的情况下,他们都无需滚动可见,你可以简单地做到以下几点:

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

这也将在情况下工作时,细胞数量的增长使得不是所有的人都在屏幕上可见并开始使用垂直滚动 - 顶部插入将设置为0

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减法,剩下的...