【问题标题】:Auto Layout causes infinite layoutSubviews loop自动布局导致无限 layoutSubviews 循环
【发布时间】:2013-09-04 08:35:30
【问题描述】:

我对此感到非常困惑,当我在子视图上使用自动布局时,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 子类,在视图控制器中使用。视图本身不使用自动布局,而是在初始化后以老式方式设置框架。

【问题讨论】:

  • 我猜你在其他地方做错了,因为我已经复制粘贴了你的代码并评论了translatesAutoresizingMaskIntoConstraints,它仍然工作正常,layoutSubview 没有被无限调用。
  • 我现在已经使用框架解决了它,当我解决它时,我会尝试在一个空项目中重现它,我会在我这样做时更新问题。同时,你知道什么会导致无限循环吗?我似乎在任何地方都找不到关于无限 layoutSubviews 循环的任何内容。
  • 你是对的,它是由其他地方引起的。其中一个超级视图已删除并在其 layoutSubviews 方法中重新添加了子视图。我不知道为什么,因为这绝对没有必要......

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


【解决方案1】:

这可能会对你有所帮助。

layoutSubviews 将被调用

  • 当视图框架发生变化时
  • 当视图从父视图中移除时,它将在父视图上调用
  • 在 UIScrollview 中,滚动期间。
  • 将视图添加到 superView 时。
  • 方向改变期间。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 很好,你发现了问题。 :)
    • 确实,改变框架不是问题,但是创建新的 UIVIEW 并将它们添加到 viewcontrollers 视图会使 didLayoutSubviews 再次被调用。而且你的权利,这段代码是不必要的,不需要删除和重新创建,只是重用。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-22
      • 2020-08-27
      • 2021-05-07
      • 2012-08-24
      • 2020-11-16
      • 1970-01-01
      相关资源
      最近更新 更多