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

时间:2015-02-26 15:06:33

标签: ios swift uicollectionview uicollectionviewlayout

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

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

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

问题:

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

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 - &gt;崩溃。 但是,当我将代码放入viewDidAppear()时,集合视图很快会出现错误大小的单元格(无论故事板中设置了什么),不久之后,单元格会更新为正确的大小

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

编辑:

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

2 个答案:

答案 0 :(得分:1)

如果collectionView的单元格必须具有静态大小,则应在 Interface Builder的实用程序栏中设置它,此处

enter image description here

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

答案 1 :(得分:0)

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

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