0

简单的问题,但不知何故我无法让它工作。所以我有一个 NSProgressIndicator,我想固定到窗口的底部,但是当我为 NSProgressIndicator 添加底部约束时,指示器不会固定到底部,而是指示器和底部之间的距离随着我慢慢增加增加窗口的大小。

这里有几张图片供参考:

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

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

但是为什么当我增加窗口大小时约束会发生变化?

我用一个按钮和一个文本字段尝试了同样的事情,它适用于其他两个控件视图,它只不适用于 NSProgressIndicator。

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

4

1 回答 1

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 像素(程序中的确切值会有所不同 - 这将是两个边缘之间出现的距离在你的xib中)。当你垂直放大你的视图时,自动布局会尝试找到一种方法来满足这两个约束,它可以通过调整进度指示器的高度来做到这一点。这很难看到,因为进度指示器没有边框,但在您上一个屏幕截图中,指示器的高度约为 400 像素,而其顶部和底部边缘到相应的超级视图边缘的距离是恒定的。

要获得您需要的行为,您需要防止自动布局使用它在不明确的布局情况下添加的约束。如果你给你的进度指示器一个高度约束,自动布局将不能同时满足两个垂直约束,所以它只会满足具有更高优先级的那个 - 那是你的约束 - 固定底部边缘的那个(1000 vs 251 )。(当然你也应该完全限制它的水平位置。)

于 2016-03-11T11:07:30.057 回答