将NSProgressIndicator固定到底部

时间:2016-03-11 06:42:33

标签: objective-c swift cocoa constraints nsprogressindicator

简单的问题,但不知怎的,我无法让它发挥作用。所以我有一个NSProgressIndicator,我想要固定到窗口的底部,但是当我为NSProgressIndicator添加底部约束时,指示器没有固定到底部,而指示器和底部之间的距离慢慢增加,因为我增加窗口的大小。

以下是几张图片供参考:

一个新项目的图片,其中只有一个进度指示器和mainmenu.xib中的约束

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

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

我使用按钮和文本字段尝试了相同的操作,它适用于其他两个控件视图,它只适用于NSProgressIndicator。

为什么会发生这种情况以及任何解决方案(甚至解决方法都没问题)的任何想法都会很棒!

1 个答案:

答案 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)。 (当然你也应该完全限制它的横向位置。)