2017-02-20 10 views
0

я написал коды, как эти, что хорошо работаетПравильно ли добавить подвид в 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, похоже, что это изменит ограничения представления, поэтому нам нужно выполнить пропуск обновления и прохождение макета снова, поэтому он будет генерировать бесконечный цикл.

, но на самом деле этот код работает хорошо, поэтому, где я ошибаюсь?

+1

Добавить 'subView' не изменит ограничения вида, поэтому' layoutSubviews' не будет вызываться. Однако 'layoutSubviews' не является хорошим местом для добавления subviews, лучше сделать это в инициализаторе. –

+0

Вы имеете в виду, что centerXConstraint выше - это не ограничения вида, но ограничение subview? поэтому макет viewSubviews в представлении может располагаться правильно – ximmyxiao

+0

Да, он просто выравнивает кнопку с центром центра X, что не влияет на положение/размер самого представления. 'layouSubiviews' вызывается, когда кадр представления изменяется, или если вы' setNeedsLayout' или 'layoutIfNeeded' вручную запускаете макет. –

ответ

2

Имейте в виду, что layoutSubviews будет называться много раз. Какой смысл делать, чтобы удалить кнопку и добавить ее снова каждый раз?

Кроме того, layoutSubviews - это то, где система автоотключения подчиняется ограничениям. Итак, какой смысл это сделать, чтобы установить ограничения кнопки в layoutSubviews?

Даже если это кажется для работы, ничего из того, что вы делаете, имеет смысл в layoutSubviews. Выполняйте эту задачу один раз и делайте это в другом месте.

+0

спасибо @matt, я видел некоторые коды (например, я выше) в updateConstraints, так что это также плохой способ добавить/удалить subView в updateConstraints? – ximmyxiao

+0

@ximmyxiao да. Сделайте это в другом месте, как в viewDidLoad. – Shebuka

+0

@Shebuka, если это в обычном uiview, похоже, что метод init будет единственным хорошим местом для таких вещей? – ximmyxiao

 Смежные вопросы

  • Нет связанных вопросов^_^