集合视图、自动布局 UICollectionViewFlowLayout 和 itemSize

Posted

技术标签:

【中文标题】集合视图、自动布局 UICollectionViewFlowLayout 和 itemSize【英文标题】:Collection View, Auto layout UICollectionViewFlowLayout and itemSize 【发布时间】:2015-02-26 15:06:32 【问题描述】:

我真的很难实现一些相当简单的事情: 我想创建一个水平集合视图,其中UICollectionViewCells 是UICollectionView 本身的大小。

到目前为止一切顺利,我已经在故事板中设置了一个看起来像这样的视图控制器(注意:集合视图不等于视图控制器的大小):

+--------------------------+
|                          |
|         Some View        |
+--------------------------+ <----- constraint
|                          |
|                          |
|      Collection View     | <----- left and right constraint
|                          |
|                          |
+--------------------------+ <----- constraint
|                          |
|      Some other view     |
+--------------------------+

问题:

尽管在控制器的 viewDidLoad() 方法中将集合视图的流布局属性的 itemSize 属性显式设置为集合视图的框架大小,但集合视图的单元格似乎不是集合视图的大小。

viewDidLoad() 我做这样的事情:

let layout = self.collectionView.collectionViewLayout as! UICollectionViewFlowLayout
layout.itemSize = self.collectionView.frame.size
layout.headerReferenceSize = CGSizeZero
layout.footerReferenceSize = CGSizeZero
layout.sectionInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
layout.minimumInteritemSpacing = 0
layout.minimumLineSpacing = 0

奇怪的事情:

当我将此代码放入awakeFromNib() 时,似乎collectionView 没有连接-> 崩溃。 但是,当我将代码放入viewDidAppear() 时,集合视图很快就会出现大小错误的单元格(无论故事板中设置了什么),不久之后,单元格更新为正确的大小

有人可以帮我解决这个问题吗?

编辑:

似乎也适用于viewDidLayoutSubviews()。不知道为什么,但我想这是因为约束尚未在viewDidLoad() 中应用。

【问题讨论】:

【参考方案1】:

如果 collectionView 的单元格必须具有静态大小,您应该在 Interface Builder's Utilities 栏中设置它,这里

否则,在您的委托控制器中实现UICollectionViewDelegateFlowLayout 协议的collectionView(_:layout:sizeForItemAtIndexPath:) 方法并从那里返回所需单元格的大小。

【讨论】:

【参考方案2】:

您可能想尝试以下方法: 在 ViewController 中,实现 didLayoutSubviews() 函数如下:

override func didLayoutSubviews() 
    super.didLayoutSubviews()
    let collectionViewSize = self.collectionView.bounds.size
    if let flowLayout = self.collectionView.collectionViewLayout as? UICollectionViewFlowLayout 
        flowLayout.itemSize = collectionViewSize
    

【讨论】:

以上是关于集合视图、自动布局 UICollectionViewFlowLayout 和 itemSize的主要内容,如果未能解决你的问题,请参考以下文章

根据各种屏幕尺寸自动布局集合视图

自动布局和集合视图问题

集合视图自动布局

集合视图、自动布局 UICollectionViewFlowLayout 和 itemSize

如何通过自动布局设置集合视图单元格大小

带有子视图的自动布局 NSCollectionView