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

Posted

技术标签:

【中文标题】调整窗口大小时带有约束的宽度限制【英文标题】:Width limitations with constraints when window resized 【发布时间】:2017-09-20 11:29:31 【问题描述】:

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

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

提前致谢。

【问题讨论】:

你试过什么?您尝试的结果是什么?这与您的预期有何不同?你有没有为此付出任何努力? 【参考方案1】:

您可以通过布局约束完成所有这些操作。

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

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

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

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

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

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

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

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

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

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

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

瞧!

【讨论】:

这是我在堆栈溢出中收到的最佳答案。非常感谢你。添加多个前导和尾随约束是我无法考虑的部分。干杯。

以上是关于调整窗口大小时带有约束的宽度限制的主要内容,如果未能解决你的问题,请参考以下文章

通过约束调整 NSImageView 的大小

垂直调整浏览器窗口大小时按比例调整图像大小?

根据父窗口小部件的宽度和高度放置一个自动调整大小的窗口小部件

如何在调整窗口大小时锁定纵横比?

在使用 css 调整窗口大小时调整 div 的宽度和高度

javascript 在加载和调整大小时检查窗口宽度