如果您没有正确约束视图,自动布局将添加它自己的约束以确保它被正确约束。在您的示例中,您可以通过记录属于窗口contentView
(进度指示器的超级视图)的约束来查看自动布局添加的内容:
var contentView = window.contentView as! NSView
for constraint in contentView.constraints {
println(constraint)
}
/*
<NSLayoutConstraint:0x6... V:[NSProgressIndicator:0x6...]-(20)-| (Names: '|':NSView:0x6... )>
<NSLayoutConstraint:0x6... H:|-(20)-[NSProgressIndicator:0x6...] (Names: '|':NSView:0x6... )>
<NSIBPrototypingLayoutConstraint:0x6... 'IB auto generated at build time for view with ambiguity' H:|-(20@251)-[NSProgressIndicator:0x6...](LTR) priority:251 (Names: '|':NSView:0x6... )>
<NSIBPrototypingLayoutConstraint:0x6... 'IB auto generated at build time for view with ambiguity' V:|-(322@251)-[NSProgressIndicator:0x6...] priority:251 (Names: '|':NSView:0x6... )>
<NSIBPrototypingLayoutConstraint:0x6... 'IB auto generated at build time for view with ambiguity' H:[NSProgressIndicator:0x6...(96@251)] priority:251>
*/
请注意,其标识符包括在构建时为具有歧义的视图自动生成的短语 IB的约束 - 这些是 Auto Layout 必须创建的约束,以防止出现歧义的布局。特别要注意这些约束中的第二个:
V:|-(322@251)-[NSProgressIndicator:0x6...] priority:251
这就是说,在可能的情况下,确保进度指示器的上边缘始终距其父视图的上边缘 322 像素(程序中的确切值会有所不同 - 这将是两个边缘之间出现的距离在你的xib中)。当你垂直放大你的视图时,自动布局会尝试找到一种方法来满足这两个约束,它可以通过调整进度指示器的高度来做到这一点。这很难看到,因为进度指示器没有边框,但在您上一个屏幕截图中,指示器的高度约为 400 像素,而其顶部和底部边缘到相应的超级视图边缘的距离是恒定的。
要获得您需要的行为,您需要防止自动布局使用它在不明确的布局情况下添加的约束。如果你给你的进度指示器一个高度约束,自动布局将不能同时满足两个垂直约束,所以它只会满足具有更高优先级的那个 - 那是你的约束 - 固定底部边缘的那个(1000 vs 251 )。(当然你也应该完全限制它的水平位置。)