layout在iOS 8 GM上无限循环的子视图



我的应用程序将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一样(作为所有自定义单元格元素的超级视图)。

最新更新