集合视图、自动布局 UICollectionViewFlowLayout 和 itemSize
Posted
技术标签:
【中文标题】集合视图、自动布局 UICollectionViewFlowLayout 和 itemSize【英文标题】:Collection View, Auto layout UICollectionViewFlowLayout and itemSize 【发布时间】:2015-02-26 15:06:32 【问题描述】:我真的很难实现一些相当简单的事情:
我想创建一个水平集合视图,其中UICollectionViewCell
s 是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的主要内容,如果未能解决你的问题,请参考以下文章