我真的很难实现相当简单的事情:
我想创建一个水平集合视图,其中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()
中应用约束。
答案 0 :(得分:1)
如果collectionView的单元格必须具有静态大小,则应在 Interface Builder的实用程序栏中设置它,此处:
否则,在委托控制器中实现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
}
}