使用 Xcode 6 和 iOS8,我的应用程序中出现了奇怪的问题。问题出在我用 xib 文件制作的自定义 UITableViewCell 中。在 iOS8 模拟器 layoutSubviews 方法被无限次调用。就像在“while(1)”中一样,或者一次又一次地调用自己。
这是布局 subview 方法:

- (void)layoutSubviews
{
    [super layoutSubviews];

    UIEdgeInsets insets = UIEdgeInsetsMake(1, 1, 1, 1);
    self.contentView.frame = UIEdgeInsetsInsetRect(UIEdgeInsetsInsetRect(self.bounds, insets), insets);

    NSLog(@"Layout");
}

当我删除 self.contentView.frame 行时,一切正常。此外,如果我使 self.contentView.translatesAutoresizingMaskIntoConstraints = NO,递归停止,但它打破了我所有的约束。
此问题仅在 iOS8 中发生,同样的方法在 iOS6 和 iOS7 中也能正常工作。

为什么我不能在这个方法中更改 self.contentView.frame ?是否有关于它的新文档?

最佳答案

我在我的一个项目中看到了类似的行为,这就是我认为基于观察正在发生的事情。在 iOS7 中,如果您使用自动布局然后修改 View 的框架,则不会调用 layoutSubviews。因此,将应用您的框架更改并且一切正常。在 iOS8 中,UIView 内部发生了一些变化。现在每次更改框架时,layoutSubviews 都会被调用。

因此,如果我们查看您的代码,我认为正在发生的是 layoutSubviews 被调用。您修改框架,这将再次触发 layoutSubviews。调用 [super layoutSubviews] 时,它​​会重新应用您的原始约束,从而重置您所做的前一帧调整。然后再次更改框架,这会触发另一个 layoutSubviews。这无限重复。

可能的解决方案:



您可以为约束创建 IBOutlets 并修改它们以获得您想要的新框架。这将使得当重新应用约束时,它们是您所做的修改,并且不会发生无限循环。

您可以在以下位置获得更多信息:

When is layoutSubviews called?

关于ios - LayoutSubviews 问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24625348/

10-13 01:57