我的应用程序将UITableViewCell
子类化,并实现layoutSubviews
来修改单元格的contentView
宽度,如下所示:
- (void)layoutSubviews {
[super layoutSubviews];
// position subviews...
CGRect frame = [[self contentView] frame];
frame.size.width -= 20;
[[self contentView] setFrame:frame];
}
当使用iOS 8模拟器和Xcode 6 GM种子运行此代码时,这会触发一个无限循环。然而,当在运行iOS 8 GM种子的真实iPhone或iPad上运行时,它不会像以前版本的iOS那样循环。
我最初认为区别在于编译器优化,但模拟器在调试配置和发布配置中都会循环。
问题
- 为什么iOS 8 GM和模拟器之间有区别
- 这是一个关键的错误修复吗?我非常不愿意发布一个显示出潜在严重挂起错误的应用程序,即使我无法在设备上复制它
- 在你看来,在iOS 7和6上重构它以消除循环而不导致回归的最佳方法是什么
这件事发生在我之前的一个iOS 8测试版上。发生在设备和模拟器上。经过一些调试,我发现UITableViewCell
可能在iOS8上内部使用了自动布局。此外,对contentView.frame
的任何更改都会触发layoutSubviews
(这可能也是您无限循环的原因之一)。
作为一种变通方法,我在单元格的contentView
中添加了一个子视图,并修改了它的frame
。然后我使用这个视图,就像使用contentView
一样(作为所有自定义单元格元素的超级视图)。