将 NSProgressIndicator 固定到底部
Pinning a NSProgressIndicator to the bottom
简单的问题,但不知何故我无法让它工作。所以我有一个 NSProgressIndicator,我想固定到 window 的底部,但是当我为 NSProgressIndicator 添加底部约束时,指示器不会固定到底部,而是固定到指示器和底部之间的距离随着我增加 window 的大小,慢慢增加。
这里有几张图片供参考:
一个新项目的图片,除了进度指示器和 mainmenu.xib
中的限制外什么都没有
当视图较小时保持约束
但是为什么当我增加 window 的大小时约束会发生变化?
我已经用一个按钮和一个文本字段尝试了同样的事情,它适用于其他两个控制视图,它只不适用于 NSProgressIndicator。
任何想法为什么会发生这种情况以及任何解决方案(即使是变通方法也很好)都会很棒!
如果您没有正确约束视图,自动布局将添加自己的约束以确保它被正确约束。在您的示例中,您可以通过记录属于 window 的 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 在构建时自动生成以用于含糊不清的视图的约束 - 这些是自动布局必须创建的约束,以防止布局不明确。特别要注意这些限制中的第二个:
V:|-(322@251)-[NSProgressIndicator:0x6...] priority:251
这就是说,在可能的情况下,确保进度指示器的上边缘始终与其父视图的上边缘相距 322 像素(您程序中的确切值将是不同 - 这将是两条边缘之间的距离,因为它们出现在您的 xib 中)。当你垂直放大你的视图时,自动布局会尝试找到一种方法来满足这两个约束,它可以通过调整进度指示器的高度来实现。这很难看到,因为进度指示器没有边框,但在您上一个屏幕截图中,指示器的高度约为 400 像素,而其顶部和底部边缘与相应超级视图边缘的距离是恒定的。
要获得您想要的行为,您需要防止自动布局使用它在布局不明确的情况下添加的约束。如果你给你的进度指示器一个高度约束,自动布局将无法满足两个垂直约束,所以它只会满足具有更高优先级的约束 - 这是你的约束 - 固定底部边缘的约束(1000 vs 251 ). (当然你也应该完全约束它的水平位置。)
简单的问题,但不知何故我无法让它工作。所以我有一个 NSProgressIndicator,我想固定到 window 的底部,但是当我为 NSProgressIndicator 添加底部约束时,指示器不会固定到底部,而是固定到指示器和底部之间的距离随着我增加 window 的大小,慢慢增加。
这里有几张图片供参考:
一个新项目的图片,除了进度指示器和 mainmenu.xib
中的限制外什么都没有当视图较小时保持约束
但是为什么当我增加 window 的大小时约束会发生变化?
我已经用一个按钮和一个文本字段尝试了同样的事情,它适用于其他两个控制视图,它只不适用于 NSProgressIndicator。
任何想法为什么会发生这种情况以及任何解决方案(即使是变通方法也很好)都会很棒!
如果您没有正确约束视图,自动布局将添加自己的约束以确保它被正确约束。在您的示例中,您可以通过记录属于 window 的 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 在构建时自动生成以用于含糊不清的视图的约束 - 这些是自动布局必须创建的约束,以防止布局不明确。特别要注意这些限制中的第二个:
V:|-(322@251)-[NSProgressIndicator:0x6...] priority:251
这就是说,在可能的情况下,确保进度指示器的上边缘始终与其父视图的上边缘相距 322 像素(您程序中的确切值将是不同 - 这将是两条边缘之间的距离,因为它们出现在您的 xib 中)。当你垂直放大你的视图时,自动布局会尝试找到一种方法来满足这两个约束,它可以通过调整进度指示器的高度来实现。这很难看到,因为进度指示器没有边框,但在您上一个屏幕截图中,指示器的高度约为 400 像素,而其顶部和底部边缘与相应超级视图边缘的距离是恒定的。
要获得您想要的行为,您需要防止自动布局使用它在布局不明确的情况下添加的约束。如果你给你的进度指示器一个高度约束,自动布局将无法满足两个垂直约束,所以它只会满足具有更高优先级的约束 - 这是你的约束 - 固定底部边缘的约束(1000 vs 251 ). (当然你也应该完全约束它的水平位置。)