什么是AutoLayout中“AmbiguousLayout”的真正含义

时间:2017-05-22 06:21:04

标签: ios autolayout nslayoutconstraint visual-format-language masonry-ios-osx

以下是我使用MasonryVFLNSLayoutConstrant方法编写的测试代码:

UIView *view1 = [UIView generateView];
UIView *view2 = [UIView generateView];
UIView *view3 = [UIView generateView];
[self.view addSubview:view1];
[self.view addSubview:view2];
[self.view addSubview:view3];

for (UIView *view in @[view1, view2, view3]) {
    NSLog(@"constrants : %@", view.constraints);
}

[view1 mas_makeConstraints:^(MASConstraintMaker *make) {
    make.left.equalTo(self.view.mas_left).offset(10);
    make.top.equalTo(self.view.mas_top).offset(74);
    make.width.equalTo(@50);
    make.height.equalTo(@50);
}];

view2.translatesAutoresizingMaskIntoConstraints = NO;
for (NSString *vfl in @[@"H:|-10-[view2(50)]", @"V:|-134-[view2(50)]"]) {
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:vfl options:NSLayoutFormatDirectionMask metrics:nil views:NSDictionaryOfVariableBindings(view2)]];
}

view3.translatesAutoresizingMaskIntoConstraints = NO;
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:view3 attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeft multiplier:1 constant:10]];
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:view3 attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTop multiplier:1 constant:194]];
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:view3 attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:50]];
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:view3 attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:50]];

我认为这不是错误,它只是一些布局代码。 但是,如果我像这样检查模糊的布局:

for (UIView *view in @[view1, view2, view3]) {
    if (view.hasAmbiguousLayout) {
        NSLog(@"view : %@", view);
        NSLog(@"horizontal : %@", [view constraintsAffectingLayoutForAxis:UILayoutConstraintAxisHorizontal]);
        NSLog(@"vertical : %@", [view constraintsAffectingLayoutForAxis:UILayoutConstraintAxisVertical]);
        NSLog(@"------------------------------------------------------------------");
    }
}

所有这三种布局方法都会引起一些问题,错误日志是:



2017-05-22 13:39:27.185 LayoutExample[13681:810371] view : <UIView: 0x7f9bdd759a60; frame = (0 0; 0 0); layer = <CALayer: 0x608000036be0>>
2017-05-22 13:39:27.185 LayoutExample[13681:810371] horizontal : (
                                                                  "<MASLayoutConstraint:0x6000000a8400 UIView:0x7f9bdd759a60.left == UIView:0x7f9bdd75a0e0.left + 10>",
                                                                  "<MASLayoutConstraint:0x6000000a8640 UIView:0x7f9bdd759a60.width == 50>"
                                                                  )
2017-05-22 13:39:27.186 LayoutExample[13681:810371] vertical : (
                                                                "<MASLayoutConstraint:0x6000000a8580 UIView:0x7f9bdd759a60.top == UIView:0x7f9bdd75a0e0.top + 74>",
                                                                "<MASLayoutConstraint:0x6000000a8700 UIView:0x7f9bdd759a60.height == 50>"
                                                                )
2017-05-22 13:39:27.186 LayoutExample[13681:810371]
------------------------------------------------------------------
2017-05-22 13:39:27.186 LayoutExample[13681:810371] view : <UIView: 0x7f9bdd759c00; frame = (0 0; 0 0); layer = <CALayer: 0x608000037820>>
2017-05-22 13:39:27.186 LayoutExample[13681:810371] horizontal : (
                                                                  "<NSLayoutConstraint:0x600000096260 UIView:0x7f9bdd759c00.left == UIView:0x7f9bdd75a0e0.left + 10>",
                                                                  "<NSLayoutConstraint:0x60000009b170 UIView:0x7f9bdd759c00.width == 50>"
                                                                  )
2017-05-22 13:39:27.187 LayoutExample[13681:810371] vertical : (
                                                                "<NSLayoutConstraint:0x60000009cb10 UIView:0x7f9bdd759c00.top == UIView:0x7f9bdd75a0e0.top + 134>",
                                                                "<NSLayoutConstraint:0x60000009c9d0 UIView:0x7f9bdd759c00.height == 50>"
                                                                )
2017-05-22 13:39:27.209 LayoutExample[13681:810371]
------------------------------------------------------------------
2017-05-22 13:39:27.209 LayoutExample[13681:810371] view : <UIView: 0x7f9bdd759da0; frame = (0 0; 0 0); layer = <CALayer: 0x608000035100>>
2017-05-22 13:39:27.210 LayoutExample[13681:810371] horizontal : (
                                                                  "<NSLayoutConstraint:0x600000095ef0 UIView:0x7f9bdd759da0.left == UIView:0x7f9bdd75a0e0.left + 10>",
                                                                  "<NSLayoutConstraint:0x60000009e2d0 UIView:0x7f9bdd759da0.width == 50>"
                                                                  )
2017-05-22 13:39:27.210 LayoutExample[13681:810371] vertical : (
                                                                "<NSLayoutConstraint:0x60000009df60 UIView:0x7f9bdd759da0.top == UIView:0x7f9bdd75a0e0.top + 194>",
                                                                "<NSLayoutConstraint:0x60000009e3c0 UIView:0x7f9bdd759da0.height == 50>"
                                                                )
2017-05-22 13:39:27.210 LayoutExample[13681:810371]
------------------------------------------------------------------
&#13;
&#13;
&#13;

我也做了一些测试,似乎只有跟上,下,左,右,相关属性的布局才会导致这样的问题。

导致这些问题的原因是什么?真正的答案是什么?

0 个答案:

没有答案