LayoutSubviews问题

时间:2014-07-08 06:48:29

标签: ios uitableview recursion autolayout

使用Xcode 6和iOS8,我的应用程序中存在奇怪的问题。问题出在我使用xib文件制作的自定义UITableViewCell中。在iOS8模拟器上layoutSubviews方法被调用无限次。就像它在"而(1)"或者一次又一次地召唤自己。 这是布局子视图方法:

- (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?有关于它的新文档吗?

1 个答案:

答案 0 :(得分:4)

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

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

可能的解决方案:

  

请勿修改框架,而是修改约束。

您可以为约束创建IBOutlet并修改它们以获得所需的新帧。这将使得当重新应用约束时,它们是你所做的修改后的,并且不会发生无限循环。

您可以在以下网址获取更多信息:

When is layoutSubviews called?