为什么删除这些约束不会导致模糊的布局异常?

时间:2012-12-09 11:14:53

标签: ios6 autolayout

在对应于viewcontroller视图的XIB文件中,打开了Autolayout,我拖出一个按钮并将其放在任意位置,以便Interface Builder自动生成按钮与其superview之间的垂直和水平间距约束(即VC的观点)。在视图控制器.m文件中,我为这两个约束创建IBOutlets,并在viewDidLoad方法中,从VC的视图[self.view removeConstraint:self.vConstraint]等中删除它们。(不,我没有忘记建立插座连接)< / p>

在运行应用程序时,我希望Xcode(版本4.5.1,如果这很重要)会抱怨布局是暧昧但令人惊讶(对我来说),它不会。

那么如何计算按钮框架的原点?该按钮确实出现在它的超级视图中,它在Interface Builder中被放置的位置,但我想知道Autolayout在这种情况下正在做什么(最好是参考官方文档)。

1 个答案:

答案 0 :(得分:1)

似乎很难找到确切的文档或其他参考资料。查看Florian Kugler's上的Advanced Auto Layout Toolbox页面有一些很棒的信息。我认为这是一个有趣的问题,我做了一些挖掘。

我在Xib中设置了一个UIButton myButton设置的测试项目以及一些空间约束插座:

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *hSpaceConstraint;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *vSpaceConstraint;

如您所述,在viewDidLoad中删除这些约束无效。删除[self.myButton hasAmbiguousLayout]中的约束后,即使立即输出viewDidLoad也会显示错误。

然而,到viewDidAppear,事情发生了变化。 myButton以及在lldb中执行自动布局跟踪时,hasAmbiguousLayout被正确标记为含糊不清:

(lldb) po [[UIWindow keyWindow] _autolayoutTrace]

*<UIWindow:0x8a94fe0> - AMBIGUOUS LAYOUT
|   *<UIView:0x8c55340>
|   |   *<UIRoundedRectButton:0x8c54100> - AMBIGUOUS LAYOUT
|   |   |   <UIImageView:0x8c54580>
|   |   |   <UIButtonLabel:0x8c595a0>
(lldb)

在这个阶段,我们也可以行使歧义:

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [self.myButton exerciseAmbiguityInLayout];
}

不运动: enter image description here 锻炼: enter image description here

控制台上也没有任何东西。这让我感到惊讶,因为我已经习惯了自动布局在第一次出现问题时挥霍了大量的约束异常。

调查一下,快速search here on SO透露了

  

“可以暂时容忍歧义(不同于不满足性,   这会立即引发异常)“

所以这解释了清晰的控制台,至少目前是这样。

总而言之,我相信在viewDidLoad执行时,已经发生了度量,布局和显示传递。删除约束然后呈现视图模糊。然后,自动布局在视图上执行常识事物,它不再知道如何布局; 没有。该观点仍在原地。