iOS 8 GM上的layoutSubviews无限循环

时间:2014-09-11 14:17:33

标签: ios uitableview ios8 infinite-loop layoutsubviews

我的应用会对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上造成回归?

1 个答案:

答案 0 :(得分:4)

这发生在之前的iOS 8测试版上。发生在设备和模拟器上。经过一些调试后,我发现UITableViewCell可能在iOS8内部使用autolayout。此外,contentView.frame触发layoutSubviews的任何更改(这也可能是您无限循环的原因)。

作为解决方法,我在单元格的contentView中添加了一个子视图,并修改了其frame。然后我使用了这个视图,就像我使用contentView一样(作为所有自定义单元格元素的超视图)。