自动布局会导致无限的layoutSubviews循环

时间:2013-09-04 08:35:30

标签: ios objective-c autolayout infinite-loop layoutsubviews

我真的对此感到困惑,当我在子视图上使用自动布局时,layoutSubview方法无限循环。

我所做的只是:

- (id)init
{
    self = [super init];
    if(self)
    {
        self.backgroundColor = [UIColor grayColor];
        _imageView = [[UIImageView alloc] init];
        _imageView.translatesAutoresizingMaskIntoConstraints = NO;
        [self addSubview:_imageView];

        [self applyConstraints];

    }
    return self;
}

-(void)applyConstraints
{
    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[_imageView]-0-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_imageView)]];
    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[_imageView]-0-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_imageView)]];
}

这会在layoutSubviews中导致无限循环。实际上,即使没有调用applyConstraints,也会发生循环,阻止它发生的唯一方法是将'translatesAutoresizingMaskIntoConstraints'设置为YES。

有没有人遇到/解决过这个问题?

更新 为了澄清,这是一个UIView子类,它在视图控制器中使用。视图本身不使用自动布局,而是在初始化后将帧设置为旧式。

3 个答案:

答案 0 :(得分:15)

这可能会对你有帮助。

将调用layoutSubviews

  • 当视图的帧发生变化时
  • 当从超级视图中删除视图时,它将在superview上调用
  • 在UIScrollview中,在滚动期间。
  • 将视图添加到superView。
  • 在方向更改期间。

答案 1 :(得分:5)

循环是由一个超级视图引起的,它正在删除其子视图,设置它们(可能是新的)帧然后重新添加它们。由于这段代码是绝对不必要的,我删除它解决了问题。

答案 2 :(得分:0)

这也会出现如果存在歧义,例如两个未确定的大于/小于等式。您应该将这些约束中的一个更改为直接相等。还要尝试通过跟踪来检测这种歧义。