window 调整大小时的宽度限制
Width limitations with constraints when window resized
我正在尝试在我的 osx 应用程序的 nswindow 中添加自定义视图。
我需要为位于中心的自定义视图提供最小和最大宽度值。视图的宽度应扩展到某个点(最大宽度值),但如果用户继续扩展 window.
,则应停止扩展
提前致谢。
您可以使用布局约束来完成所有这些操作。
首先,我们需要指定视图相对于 window 的位置。为了本教程,我假设您希望它居中:
接下来,我们添加最小宽度的约束:
要使其成为最小宽度而不是绝对宽度,请单击约束并在属性检查器中将其更改为 "Greater Than or Equal":
现在做同样的事情,对最大值进行另一个宽度限制。这次,将其设置为 "Less Than or Equal":
现在设置了宽度限制。但我们还没有完成。我们现在已经设置了最小值和最大值,但宽度仍然不明确——布局约束系统无法确定它在任何给定点实际应该使用的 300 到 700 之间的确切宽度。有两个步骤可以解决这个问题。首先,我们需要确保视图完全在 window 内而不是 运行 边缘,因此创建一些大于或等于约束以确保它保持在其范围内:
(另外,做一个相同设置的尾随约束)。
最后,我们需要最后一组约束;我们需要一些前导和尾随约束,标记为相等,但优先级较低:
(同时添加尾随约束,配置相同)
这个是做什么的?好吧,它告诉我们,除非我们的其他约束(特别是最大宽度,在我们的例子中)使它不可能,否则我们希望视图的边缘与 window 边缘的标准距离。我们使用 499 作为优先级的原因是因为 NSLayoutConstraint.Priority.windowSizeStayPut
的值为 500。文档对 .windowSizeStayPut
:
有这样的说明
It's generally not appropriate to make a constraint at exactly this priority. You want to be higher or lower. Constraints with higher priorities can adjust the window’s size. Constraints with lower priorities must be fulfilled using the current window size.
如果我们将约束设置为高于 500,系统将限制我们使 window 太宽以至于这些约束无效。这不是我们想要的,因为在这种情况下我们希望边缘间距扩大。因此,由于我们希望能够通过调整 window 的大小来打破此约束,我们将其设置为略小于 500,即 499。这意味着约束系统将尝试将视图放在这里,但如果它不能这样做是因为我们把 window 设置得太宽了,它会打破这个约束,尽管它仍然会尝试在不破坏其他约束的情况下尽可能接近。因此,您的视图将处于最大宽度,并以 window.
为中心
瞧!
我正在尝试在我的 osx 应用程序的 nswindow 中添加自定义视图。
我需要为位于中心的自定义视图提供最小和最大宽度值。视图的宽度应扩展到某个点(最大宽度值),但如果用户继续扩展 window.
,则应停止扩展提前致谢。
您可以使用布局约束来完成所有这些操作。
首先,我们需要指定视图相对于 window 的位置。为了本教程,我假设您希望它居中:
接下来,我们添加最小宽度的约束:
要使其成为最小宽度而不是绝对宽度,请单击约束并在属性检查器中将其更改为 "Greater Than or Equal":
现在做同样的事情,对最大值进行另一个宽度限制。这次,将其设置为 "Less Than or Equal":
现在设置了宽度限制。但我们还没有完成。我们现在已经设置了最小值和最大值,但宽度仍然不明确——布局约束系统无法确定它在任何给定点实际应该使用的 300 到 700 之间的确切宽度。有两个步骤可以解决这个问题。首先,我们需要确保视图完全在 window 内而不是 运行 边缘,因此创建一些大于或等于约束以确保它保持在其范围内:
(另外,做一个相同设置的尾随约束)。
最后,我们需要最后一组约束;我们需要一些前导和尾随约束,标记为相等,但优先级较低:
(同时添加尾随约束,配置相同)
这个是做什么的?好吧,它告诉我们,除非我们的其他约束(特别是最大宽度,在我们的例子中)使它不可能,否则我们希望视图的边缘与 window 边缘的标准距离。我们使用 499 作为优先级的原因是因为 NSLayoutConstraint.Priority.windowSizeStayPut
的值为 500。文档对 .windowSizeStayPut
:
It's generally not appropriate to make a constraint at exactly this priority. You want to be higher or lower. Constraints with higher priorities can adjust the window’s size. Constraints with lower priorities must be fulfilled using the current window size.
如果我们将约束设置为高于 500,系统将限制我们使 window 太宽以至于这些约束无效。这不是我们想要的,因为在这种情况下我们希望边缘间距扩大。因此,由于我们希望能够通过调整 window 的大小来打破此约束,我们将其设置为略小于 500,即 499。这意味着约束系统将尝试将视图放在这里,但如果它不能这样做是因为我们把 window 设置得太宽了,它会打破这个约束,尽管它仍然会尝试在不破坏其他约束的情况下尽可能接近。因此,您的视图将处于最大宽度,并以 window.
为中心瞧!