【发布时间】: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