я написал коды, как эти, что хорошо работаетПравильно ли добавить подвид в layoutSubviews при использовании Autolayout
@interface SubView()
@property(nonatomic,strong) UIButton* btn;
@end
@implementation SubView
- (void)layoutSubviews
{
[super layoutSubviews];
[self.btn removeFromSuperview];
self.btn = [UIButton buttonWithType:UIButtonTypeCustom];
self.btn.backgroundColor = [UIColor greenColor];
[self.btn setTitle:@"btn" forState:UIControlStateNormal];
self.btn.translatesAutoresizingMaskIntoConstraints = NO;
[self addSubview:self.btn];
NSLayoutConstraint* centerXConstraint = [self.btn.centerXAnchor constraintEqualToAnchor:self.centerXAnchor];
NSLayoutConstraint* centerYConstraint = [self.btn.centerYAnchor constraintEqualToAnchor:self.centerYAnchor];
[self addConstraint:centerXConstraint];
[self addConstraint:centerYConstraint];
}
@end
Но на мой взгляд, при использовании Autolayout, система будет делать макет в два этапа 1 Update Pass 2 Layout Pass, а layoutSubviews находится на этапе 2 (Layout Pass)
поэтому, если мы добавим subview в layoutSubviews, похоже, что это изменит ограничения представления, поэтому нам нужно выполнить пропуск обновления и прохождение макета снова, поэтому он будет генерировать бесконечный цикл.
, но на самом деле этот код работает хорошо, поэтому, где я ошибаюсь?
Добавить 'subView' не изменит ограничения вида, поэтому' layoutSubviews' не будет вызываться. Однако 'layoutSubviews' не является хорошим местом для добавления subviews, лучше сделать это в инициализаторе. –
Вы имеете в виду, что centerXConstraint выше - это не ограничения вида, но ограничение subview? поэтому макет viewSubviews в представлении может располагаться правильно – ximmyxiao
Да, он просто выравнивает кнопку с центром центра X, что не влияет на положение/размер самого представления. 'layouSubiviews' вызывается, когда кадр представления изменяется, или если вы' setNeedsLayout' или 'layoutIfNeeded' вручную запускаете макет. –