UITableViewCell 重用后 topLayoutGuide 搞砸了

Posted

技术标签:

【中文标题】UITableViewCell 重用后 topLayoutGuide 搞砸了【英文标题】:topLayoutGuide messes up after UITableViewCell reuse 【发布时间】:2014-12-05 14:26:54 【问题描述】:

我有一个UITableViewCell 子类,我在其中实例化了一个UIViewController 子类并将它的view 添加到UITableViewCellcontentView

viewController.view.frame = CGRectMake(0, 0, contentView.frame.size.width, contentView.frame.size.height)
contentView.addSubview(viewController.view)

viewController(它是在故事板中创建的)内部,我有一个固定在视图顶部的UIImageView(嗯,它是topLayoutGuide,因为Xcode 6 Interface Builder 似乎只允许我使用固定到topLayoutGuide,而不是容器顶部边缘...)

我还要提一下,单元格高度为 230,与 Storyboard 中的 viewController.view 大小相同,因此 viewController 应该占据整个单元格的大小。

这在第一次显示单元格时一切正常,但在重用 viewController 中的 topLayoutGuide 后似乎随机混乱,导致 UIImageView 不再固定在单元格顶部,并且而是向下移动:

在第一次显示时,topLayoutGuide.length 为 0,这是正确的。但是,在上下滚动一下之后,我可以在单元格的 prepareForReuse() 中看到 viewController.topLayoutGuide.length 更改为 179.333333333333 或 163.666666666667,这会导致整个单元格布局混乱。

我不明白为什么topLayoutGuide 在单元重用后会这样改变自己。

我想一种解决方法是将受影响的UIImageView 固定到顶部容器边缘而不是topLayoutGuide,这将回避这个问题——但似乎 Xcode 6 不再提供此功能(至少,不是无需在代码中手动创建约束...)

此行为在 ios 8 中出现,我没有测试过其他 iOS 版本。

【问题讨论】:

【参考方案1】:

我从未设法找出问题所在,以及为什么topLayoutGuide 在单元重用后变得奇怪,但我确实设法找出如何固定到超级视图(容器)边界而不是布局指南Xcode 6,这就解决了这个问题。

在 Interface Builder 中,我使用了 Editor > Pin > Top Space to Superview,这为我解决了问题。

鉴于此选项似乎除了菜单选项之外不存在于其他任何地方,这似乎完全不直观,但这是适合您的 Interface Builder...!

【讨论】:

将顶部空间固定到超级视图是故事板中的常规约束。应该是右下角菜单中的一个选项,或者如果你 ctrl + 从视图向上拖动到它的超级视图。 以前总是这样,但在 Xcode 6.1 中,即使我专门选择了超级视图,它似乎也坚持固定到“顶部布局指南”。我能找到强制它固定到 Xcode 6 中的超级视图的唯一方法是通过编辑器菜单。 取决于视图的定位。如果您在靠近顶部的根视图中有子视图,它将默认为 topLayoutGuide。您应该可以在检查器中将其更改回来。会检查并确保。

以上是关于UITableViewCell 重用后 topLayoutGuide 搞砸了的主要内容,如果未能解决你的问题,请参考以下文章

UITableViewCell的重用机制原理

通过按钮、标签和单元格重用问题检查 uitableviewcell 中的图像无法正常工作

UITableViewCell 没有正确重用?

UITableViewCell重用的问题

UItableviewCell 单元格重用问题

UITableViewCell的重用机制