简单的问题,但不知何故我无法让它起作用。所以我有一个NSProgressIndicator,我想把它钉在窗口的底部,但是当我为NSProgressIndicator添加底部约束时,指示器不会被固定在底部,而是随着窗口大小的增加,指示器和底部之间的距离会慢慢增大。
以下是几张供参考的图片:
一个新项目的图片,它的mainmenu.xib中只有一个进度指示符和一个约束。

当视图很小时,约束被保持。

但是为什么约束随着我增加窗口的大小而改变呢?

我尝试过用一个按钮和一个文本字段做同样的事情,它适用于另外两个控件视图,它只对NSProgressIndicator不起作用。
任何想法,为什么会发生这种情况,任何解决方案(甚至解决办法都会很好)将是伟大的!
发布于 2016-03-11 11:07:30
如果没有对视图进行适当的约束,自动布局将添加自己的约束,以确保其受到适当的约束。在您的示例中,您可以通过记录属于窗口的contentView (进度指示器的superview)的约束来查看自动布局:
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自动生成的约束--这些约束是自动布局为防止模糊布局而必须创建的约束。特别要注意这些限制中的第二个:
V:|-(322@251)-[NSProgressIndicator:0x6...] priority:251这意味着,在可能的情况下,确保进度指示器的顶部边缘总是322像素与其superview的顶部边缘(您的程序中的确切值将是不同的-它将是两个边缘之间的距离,因为它们出现在您的xib中)。当您垂直放大您的视图,自动布局将试图找到一种方式来遵守这两个限制,它可以通过调整进度指示器的高度。这是很难看到的,因为进度指示器没有边框,但是在最后一张屏幕截图中,指示器的高度大约是400像素,而它的顶部和底部边缘到相应的superview边缘的距离是恒定的。
为了获得您想要的行为,您需要阻止自动布局使用它在布局不明确的情况下添加的约束。如果你给你的进度指示器一个高度限制,自动布局将不能满足两个垂直约束,所以它将只满足一个具有较高的优先级-这是你的约束-一个钉在底部边缘(1000比251)。(当然,你也应该完全限制它的水平位置。)
https://stackoverflow.com/questions/35933847
复制相似问题