4

我对此感到非常困惑,当我在子视图上使用自动布局时,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”设置为“是”。

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

更新 只是为了澄清,这是一个 UIView 子类,在视图控制器中使用。视图本身不使用自动布局,而是在初始化后以老式方式设置框架。

4

3 回答 3

18

这可能会帮助你。

layoutSubviews 将被调用

  • 当视图的框架发生变化时
  • 当从超级视图中删除视图时,它将在超级视图上调用
  • 在 UIScrollview 中,在滚动期间。
  • 在将视图添加到 superView 时。
  • 在方向改变期间。
于 2013-09-05T04:00:20.463 回答
7

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

于 2013-09-04T14:01:40.403 回答
0

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

于 2015-08-26T14:07:26.420 回答