【问题标题】:layoutSubviews in infinite loop on iOS 8 GMiOS 8 GM 上无限循环中的 layoutSubviews
【发布时间】:2014-09-11 14:17:32
【问题描述】:

我的应用继承了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 上进行重构以消除循环而不导致回归的最佳方法是什么?

【问题讨论】:

  • 这段代码看起来很糟糕,想象一下屏幕上发生的事情会导致所有视图重新布局它们的子视图:您的内容视图可以轻松地缩小到零宽度。并不是说这就是模拟器上发生的事情,但我相信如果你在解决可能的错误方面有如此好的态度,你不妨解决这个问题。我还没有下载GM种子,然后我会测试你的代码,看看问题是否容易被复制,同时你可以选择其中一个单元格并发布递归的回溯(不是第一个)方法调用。

标签: ios uitableview ios8 infinite-loop layoutsubviews


【解决方案1】:

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

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

【讨论】:

  • 您能否详细说明如何执行此操作?我有同样的问题。我想确保在横向模式下将 detailView 调整为正确的宽度。谢谢!
  • 我不确定您的确切问题是什么。我创建了一个要点,在代码中展示了这个想法:gist.github.com/mciuba/5b9bb9842eb141bea01e。如果这没有帮助,也许可以提出一个新问题并在此处提供更多详细信息。
  • 你太棒了,这将花费我几天的时间。我手动计算单元格的高度并更改 layoutSubviews 中的 contentView 框架。关闭 nib 文件的自动布局解决了这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多