Ios 自动布局导致无限布局子视图循环

Ios 自动布局导致无限布局子视图循环,ios,objective-c,autolayout,infinite-loop,layoutsubviews,Ios,Objective C,Autolayout,Infinite Loop,Layoutsubviews,我真的很困惑,当我在子视图上使用自动布局时,layoutSubview方法会无限循环 我所做的就是: - (id)init { self = [super init]; if(self) { self.backgroundColor = [UIColor grayColor]; _imageView = [[UIImageView alloc] init]; _imageView.translatesAutoresizing

我真的很困惑,当我在子视图上使用自动布局时,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)]];
}
这会导致LayoutSubView中出现无限循环。实际上,即使没有调用applyConstraints,循环也会发生,阻止它发生的唯一方法是将“TranslatesAutoResizengMaskinToConstraints”设置为“是”

以前有人遇到/解决过这个问题吗

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

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

这可能会对您有所帮助

将调用布局子视图

  • 当视图的框架发生变化时
  • 从superview中删除视图后,将在superview上调用该视图
  • 在UIScrollview中,在滚动期间
  • 将视图添加到superView时
  • 在方向改变的过程中

如果存在歧义,例如两个不确定的大于/小于等式,也会出现这种情况。您应该将其中一个约束更改为直接相等。也可以通过跟踪来检测这种模糊性。

我想你在其他地方做错了,因为我已经复制粘贴了你的代码并注释了
translatesAutoresizingMaskIntoConstraints
,但它仍然工作正常,layoutSubview没有被无限调用。我现在已经使用框架解决了这个问题,当我开始讨论这个问题时,我会尝试在一个空的项目中重现这个问题,然后更新这个问题。同时,你知道是什么导致了无限循环吗?我在任何地方都找不到关于无限布局子视图循环的任何内容。你是对的,它是由其他地方引起的。已删除其中一个SuperView并在其layoutSubviews方法中重新添加子视图。我不知道为什么,因为这是完全没有必要的……很好,你解决了这个问题。:)事实上,更改框架并不是问题,但创建新的UIVIEW并将其添加到viewcontrollers视图会使DidLayoutSubView再次被调用。你的权利,这段代码是不必要的,不需要删除和重新创建,只需要重用。