UICollectionReusableView 约束未更新

Posted

技术标签:

【中文标题】UICollectionReusableView 约束未更新【英文标题】:UICollectionReusableView constraints not updating 【发布时间】:2017-05-10 09:00:48 【问题描述】:

我正在尝试在某些加载事件时动态激活/停用我的 UICollectionReusableView 子类上的一些布局约束。

我已经设置了布局约束,有些已激活,有些已停用。 (在你问之前,我所有的约束都被强引用,我知道停用的约束没有被保留并被释放

在刷新代码时,我激活一些约束/停用其他约束(在调试器中,确保它们都不是nil),在单元格上调用setNeedsLayoutlayoutIfNeeded,但没有任何反应。我目视检查布局并检查约束。约束就好像我的代码甚至没有被命中(当然,它被命中了,我已经放了一个调试器)。也没有破坏任何约束,我检查了日志。我已停用的约束仍处于活动状态,而我已激活的约束未激活,视觉布局确认此状态。

我还记录了来自awakeFromNib 的一些文本,它只记录了一次,所以没有另一个标题实例。

即使代码被命中并且所有内容都被正确引用,约束没有被激活/停用的原因可能是什么?

【问题讨论】:

【参考方案1】:

好的,原来问题与所有者视图控制器作为实例变量手动持有的标题视图有关,并且在最初出列后没有出列/重用(viewForSupplementaryElementOfKind:atIndexPath 此后总是返回该实例变量)。我的约束没有任何问题。

以前的开发者,出于某种原因,手动持有视图的强引用并且总是返回相同的视图,这可能导致集合视图行为的一些内部不稳定。我已将其更正为返回标题单元格的常规 dequeueReusableSupplementaryViewOfKind:withReuseIdentifier:forIndexPath 方式,问题就消失了。

永远不要保留对可重用视图/单元格的引用(或者至少,不要忘记在需要时调用出队代码并刷新指针)。似乎它会导致未记录/不可预测的布局问题。

【讨论】:

以上是关于UICollectionReusableView 约束未更新的主要内容,如果未能解决你的问题,请参考以下文章

Swift - UICollectionReusableView 的子视图不适合宽度

未显示自定义 UICollectionReusableView 元素

显示部分标题 UICollectionReusableView

UICollectionReusableView 中未调用委托

协议和委托不适用于 UICollectionReusableView

UICollectionReusableView 中的标签始终为零