UICollectionViewCell 在添加到任何父视图之前没有子视图(除了 contentView)

Posted

技术标签:

【中文标题】UICollectionViewCell 在添加到任何父视图之前没有子视图(除了 contentView)【英文标题】:UICollectionViewCell has no subviews (besides contentView) until it is added to any parent view 【发布时间】:2015-12-04 07:04:10 【问题描述】:

首先,这是我发现的唯一可能相关的问题:viewWithTag in UICollectionViewCell returns nil in Swift (until cell is reused)

我正在使用 Xcode 7.1.1,实际上我的故事板中有另一个 UIcollectionView 可以正常工作。我找不到有效的和这个之间没有区别。

这是证明我疯狂的代码(来自 cellForItemAtIndexPath 内部):

let cell = collectionView.dequeueReusableCellWithReuseIdentifier("VariantCell", forIndexPath: indexPath)

let cellBeforeCount    = cell.subviews.count
let contentBeforeCount = cell.contentView.subviews.count

self.view.addSubview(cell)

let cellAfterCount    = cell.subviews.count
let contentAfterCount = cell.contentView.subviews.count

print("\(cellBeforeCount) \(contentBeforeCount) \(cellAfterCount) \(contentAfterCount)")`

cellBeforeCount == 1, contentBeforeCount = 0, cellAfterCount == 4, contentAfterCount == 0

这是这个 VC 的 XML 故事板:

如您所见,<collectionViewCell> 中的第一个视图是键为 contentView 的视图,而我的标签(您只能看到第一个)是它的子视图。

为什么在将单元格添加到父视图之后才会存在子视图,为什么不将子视图添加到 contentView?两者应该有关系吧?

【问题讨论】:

这行'self.view.addSubview(cell)'的目的是什么? 只是为了表明我的单元格中没有子视图,直到它具有父视图之后。我对我的单元格进行了子类化,并且从awakeFromNib 内部它没有子视图。但是,从内部layoutSubviews 他们都在那里。正是这个事实让我想到,也许直到单元格真正落入另一个视图之前,它才有自己的子视图。为了测试这个假设,我只是将单元格添加到我能想到的第一个视图中(恰好是 self.view)。 【参考方案1】:

好吧,把它归结为不理解大小类。我禁用了它,单元格现在有预期的子视图:

考虑到单元格不知道其父级的大小,因此它不知道要呈现哪些约束/视图是有道理的。这也解释了为什么单元格在添加到任何父级后会有子视图(因此可以推断其大小)。

这是一个 iPad 应用,所以我不需要 Size Classes。

我希望这对某人有所帮助。

【讨论】:

以上是关于UICollectionViewCell 在添加到任何父视图之前没有子视图(除了 contentView)的主要内容,如果未能解决你的问题,请参考以下文章

无法将 UILabel 添加到 UICollectionViewCell

如何将子视图添加到自定义 UICollectionViewCell

将子视图添加到 UICollectionViewCell 时出现意外行为

将子视图添加到 UICollectionViewCell 子类?

UICollectionViewCell 在添加到任何父视图之前没有子视图(除了 contentView)

以编程方式将 UILabel 添加到 UICollectionViewCell