【问题标题】:ios autolayout NSConstraints conflictios自动布局NSConstraints冲突
【发布时间】:2021-02-11 22:00:03
【问题描述】:
    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);
     }];```
   

登录视图是超级视图。它包含帐户输入控件 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);
    }];
    

但是为什么约束冲突呢?我很困惑。

【问题讨论】:

  • 我能看到的最好的结果是你给了东西一个leftrightwidth 约束,但是 actual 宽度(当只应用左和右约束)导致与 that 约束不同的宽度。它决定打破正确的约束,而不是自动布局引擎泄漏宽度约束......
  • .... 你有两个选择。 (请记住,在init 中添加约束并没有做错任何事情,而是告诉布局引擎处理两个冲突的事情。)首先,您可以尝试删除宽度约束 - 我会打赌你会得到一个你没想到的宽度!第二个修复比较棘手,但如果你有这个宽度限制有一个特定的原因,它会起作用......给你的限制优先级。这将告诉布局引擎在发生冲突时更愿意打破哪个约束。
  • 另外,通常你应该使用前导和尾随,而不是左右,以便你的布局正确地适应从右到左的语言环境
  • 我没有添加登录视图宽度约束。我添加左右上下约束作为代码显示。

标签: ios objective-c autolayout


【解决方案1】:

我曾经在 init 方法中添加约束。我将代码移动到 layoutSubviews 方法。没有约束冲突的警告。但我不知道原因。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    • 2016-04-16
    相关资源
    最近更新 更多