конфликт NSConstraints автозапуска ios

#ios #objective-c #autolayout

#iOS #objective-c #автозапуск

Вопрос:

     Probably at least one of the constraints in the following list is one you don't want. 
    Try this: 
        (1) look at each constraint and try to figure out which you don't expect; 
        (2) find the code that added the unwanted constraint or constraints and fix it. 
(
    "<MASLayoutConstraint:0x2831fb1e0 LMTextField:0x105836200.left == LMLoginView:0x1050429e0.left   22.08>",
    "<MASLayoutConstraint:0x2831fbba0 LMTextField:0x105836200.right == LMLoginView:0x1050429e0.right - 22.08>",
    "<NSLayoutConstraint:0x2836c1a90 LMLoginView:0x1050429e0.width == 0>"
)

Will attempt to recover by breaking constraint 
<MASLayoutConstraint:0x2831fbba0 LMTextField:0x105836200.right == LMLoginView:0x1050429e0.right - 22.08>
  

Я добавляю loginview в представление logincontroller.

 [self.lmLoginView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.mas_equalTo(ws.aqaraLogoImgView.mas_bottom).offset(60 * kWidthScale);
         make.left.right.bottom.mas_equalTo(ws.view);
     }];```
   
  

Loginview — это супервизор. он содержит элемент управления вводом учетной записи LMTextField:0x105836200

     [self.accountInput mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.mas_equalTo(ws).offset(0);
        make.left.mas_equalTo(ws.mas_left).offset(20 * kWidthScale);
        make.right.mas_equalTo(ws.mas_right).offset(-20 * kWidthScale);
        make.height.mas_equalTo(40 * kWidthScale);
    }];
    
  

но почему ограничения конфликтуют? Я в замешательстве.

Комментарии:

1. Лучшее, что я вижу, это то, что вы даете вещи left , right , и width ограничения, но фактическая ширина (при применении только левых и правых ограничений) приводит к другой ширине, чем было бы это ограничение. Вместо того, чтобы механизм автоматической компоновки пропускал ограничение ширины, он решил нарушить правильное ограничение…..

2. …. у вас есть два варианта. (Имейте в виду, вы не делаете ничего плохого, добавляя ограничения в init , скорее вы указываете движку компоновки на две конфликтующие вещи.) Во-первых, вы можете попробовать удалить ограничение ширины — и я бы поспорил, что вы получите ширину, которую вы не ожидали! Второе исправление сложнее, но если у вас есть это ограничение ширины по определенной причине, оно сработает … укажите приоритеты ваших ограничений. Это сообщит механизму компоновки, какое ограничение вы предпочитаете нарушать при возникновении конфликта.

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

4. Я не добавляю ограничение ширины loginview. я добавляю ограничения слева направо сверху вниз, как показано в коде.

Ответ №1:

Раньше я добавлял ограничения в метод инициализации. Я переношу код в метод layoutSubviews. не имеет предупреждения о конфликтах ограничений. но я не знаю причины.

 -(instancetype)init {
    if (self = [super init]) {
        [self buildSubViews];
         
    }
    return self;
}
  
 - (void)layoutSubviews {
    [super layoutSubviews];
}