窗口大小调整时带约束的宽度限制

时间:2017-09-20 11:29:32

标签: swift macos cocoa nslayoutconstraint

我正在尝试在我的osx应用程序中的nswindow中添加自定义视图。

Page Resize

我需要为位于中心的自定义视图提供最小和最大宽度值。视图的宽度应该扩展到某个点(最大宽度值),但如果用户继续展开窗口,则应该停止扩展。

提前致谢。

1 个答案:

答案 0 :(得分:2)

您可以使用布局约束来完成所有这些操作。

首先,我们需要指定视图相对于窗口的位置。为了本教程的目的,我假设您希望它居中:

enter image description here

接下来,我们为最小宽度添加约束:

enter image description here

要将此值设为最小值而不是绝对宽度,请单击约束并在“属性”检查器中将其更改为“大于或等于”:

enter image description here

现在做同样的事情,为最大值制作另一个宽度约束。这次,将其设置为“小于或等于”:

enter image description here

现在设置宽度约束。但我们还没有完成。我们现在已经设置了最小值和最大值,但宽度仍然不明确 - 布局约束系统无法确定在任何给定点实际应该使用的300到700之间的确切宽度。有两个步骤可以解决这个问题。首先,我们需要确保视图完全在窗口内而不是边缘运行,因此创建一些大于或等于约束,确保它保持在其范围内:

enter image description here enter image description here

(另外,设置一个相同设置的尾随约束)。

最后,我们需要最后一组约束;我们想要一些前导和尾随约束,标记为Equal,但优先级较低:

enter image description here

(还添加一个尾随约束,配置相同)

这个人做了什么?好吧,它告诉我们,除非我们的其他约束(特别是最大宽度,在我们的例子中)使它不可能,我们希望视图的边缘是距窗口边缘的标准距离。我们使用499作为优先级的原因是因为NSLayoutConstraint.Priority.windowSizeStayPut的值是500.文档中有关于.windowSizeStayPut的说法:

  

通常不适合以此优先级进行约束。你想要更高或更低。具有较高优先级的约束可以调整窗口的大小。必须使用当前窗口大小来满足具有较低优先级的约束。

如果我们将约束设置为高于500,系统将限制我们使窗口太宽以使这些约束有效。这不是我们想要的,因为在这种情况下我们希望边缘间距扩大。因为我们希望能够通过调整窗口大小来打破这个约束,我们将它设置为略小于500-so,499。这意味着约束系统将尝试将视图放在这里,但如果它不能做因为我们使窗口太宽,它会允许这个约束中断,尽管它仍然会尽可能地接近它而不会破坏其他约束。因此,您的视图将处于最大宽度,并以窗口为中心。

瞧!