UITableViewCell 重用后 topLayoutGuide 搞砸了
Posted
技术标签:
【中文标题】UITableViewCell 重用后 topLayoutGuide 搞砸了【英文标题】:topLayoutGuide messes up after UITableViewCell reuse 【发布时间】:2014-12-05 14:26:54 【问题描述】:我有一个UITableViewCell
子类,我在其中实例化了一个UIViewController
子类并将它的view
添加到UITableViewCell
的contentView
:
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 搞砸了的主要内容,如果未能解决你的问题,请参考以下文章