简单的问题,但不知怎的,我无法让它发挥作用。所以我有一个NSProgressIndicator,我想要固定到窗口的底部,但是当我为NSProgressIndicator添加底部约束时,指示器没有固定到底部,而指示器和底部之间的距离慢慢增加,因为我增加窗口的大小。
以下是几张图片供参考:
一个新项目的图片,其中只有一个进度指示器和mainmenu.xib中的约束
当视图很小时,约束被保持
但是为什么约束会随着窗口大小的增加而改变?
我使用按钮和文本字段尝试了相同的操作,它适用于其他两个控件视图,它只适用于NSProgressIndicator。
为什么会发生这种情况以及任何解决方案(甚至解决方法都没问题)的任何想法都会很棒!
答案 0 :(得分:1)
如果您没有正确约束视图,自动布局将添加自己的约束以确保其受到适当约束。在您的示例中,您可以通过记录属于窗口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像素(程序中的确切值将不同 - 它&#39 ; ll是两个边缘之间的距离,因为它们出现在你的xib中)。当您垂直放大视图时,自动布局将尝试找到一种方法来遵守这两个约束,它可以通过调整进度指示器的高度来实现。这很难看,因为进度指示器没有边框,但在最后一个屏幕截图中,指示器的高度约为400像素,而其顶部和底部边缘与相应的超视图边缘的距离是恒定的。
在需要阻止自动布局使用在布局不明确的情况下添加的约束后,获取您的行为。如果你给你的进度指示器一个高度约束,自动布局就不能满足两个垂直约束,所以它只是满足那个具有更高优先级的那个 - 这是你的约束 - 一个钉住底边(1000对251)。 (当然你也应该完全限制它的横向位置。)