Ios6 为什么删除这些约束不会导致不明确的布局异常?

Ios6 为什么删除这些约束不会导致不明确的布局异常?,ios6,autolayout,Ios6,Autolayout,在与viewcontroller视图相对应的XIB文件中,在启用Autolayout的情况下,我拖出一个按钮并将其放置在任意位置,以便Interface Builder自动在按钮及其superview(即VC的视图)之间生成垂直和水平间距约束。在view controller.m文件中,我为这两个约束创建了IBoutlet,并在viewDidLoad方法中,将它们从VC的视图中删除[self.view removeConstraint:self.vConstraint]等(不,我没有忘记建立插座

在与viewcontroller视图相对应的XIB文件中,在启用Autolayout的情况下,我拖出一个按钮并将其放置在任意位置,以便Interface Builder自动在按钮及其superview(即VC的视图)之间生成垂直和水平间距约束。在view controller.m文件中,我为这两个约束创建了IBoutlet,并在viewDidLoad方法中,将它们从VC的视图中删除
[self.view removeConstraint:self.vConstraint]
等(不,我没有忘记建立插座连接)

在运行应用程序时,我希望Xcode(版本4.5.1,如果有必要的话)会抱怨布局含糊不清,但令人惊讶的是(对我来说),它没有


那么如何计算按钮框架的原点呢?该按钮确实出现在界面生成器中的superview位置,但我想知道在这种情况下Autolayout到底在做什么(最好参考官方文档)

似乎很难找到这方面的确切文件或其他参考资料。浏览网页上的内容,可以获得一些很好的信息。因为我认为这是一个有趣的问题,所以我做了一些调查

我在Xib中设置了一个带有
ui按钮
myButton
设置的测试项目和几个空间限制插座:

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *hSpaceConstraint;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *vSpaceConstraint;
如您所述,在
viewDidLoad
中删除这些约束没有任何效果。即使在移除
viewDidLoad
中的约束后立即输出
[self.myButton hasmigiouslayout]
,也会显示false

然而,通过
视图显示
,情况发生了变化<代码>myButton通过
hasAmbiguousLayout
和在lldb中执行自动布局跟踪正确标记为不明确:

(lldb) po [[UIWindow keyWindow] _autolayoutTrace]

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

控制台上也没有任何东西。这让我很惊讶,因为我习惯于在出现问题的第一个迹象时就自动布局大量的约束异常

对此进行调查后,一份快速报告显示

“歧义可以暂时容忍(与不可满足性不同, 这立即引发了一个例外

这就解释了clear控制台,至少目前是这样


最后,我相信在执行
viewDidLoad
时,度量、布局和显示过程已经发生。删除约束后,视图将变得不明确。自动布局然后在它不再知道如何布局的视图上做常识性的事情;没有什么。这一观点仍然存在

似乎很难找到这方面的确切文件或其他参考资料。浏览网页上的内容,可以获得一些很好的信息。因为我认为这是一个有趣的问题,所以我做了一些调查

我在Xib中设置了一个带有
ui按钮
myButton
设置的测试项目和几个空间限制插座:

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *hSpaceConstraint;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *vSpaceConstraint;
如您所述,在
viewDidLoad
中删除这些约束没有任何效果。即使在移除
viewDidLoad
中的约束后立即输出
[self.myButton hasmigiouslayout]
,也会显示false

然而,通过
视图显示
,情况发生了变化<代码>myButton通过
hasAmbiguousLayout
和在lldb中执行自动布局跟踪正确标记为不明确:

(lldb) po [[UIWindow keyWindow] _autolayoutTrace]

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

控制台上也没有任何东西。这让我很惊讶,因为我习惯于在出现问题的第一个迹象时就自动布局大量的约束异常

对此进行调查后,一份快速报告显示

“歧义可以暂时容忍(与不可满足性不同, 这立即引发了一个例外

这就解释了clear控制台,至少目前是这样


最后,我相信在执行
viewDidLoad
时,度量、布局和显示过程已经发生。删除约束后,视图将变得不明确。自动布局然后在它不再知道如何布局的视图上做常识性的事情;没有什么。这一观点仍然存在

我应该补充一点,旋转模拟器也没有任何区别,按钮的框架保持不变。没有含糊不清的布局例外。我猜帧在viewDidLoad之前已经计算过了,即使在移除了约束之后,Autolayout仍然会继续使用相同的帧?我应该补充一点,旋转模拟器也没有任何区别,按钮的帧仍然保持不变。没有含糊不清的布局例外。我猜帧在viewDidLoad之前已经计算过了,即使在移除约束后,Autolayout还是会继续使用相同的帧?