#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];
}