调整窗口大小时带有约束的宽度限制
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。这意味着约束系统会尝试将视图放在这里,但如果它做不到因为我们让窗口太宽,它会允许这个约束被打破,尽管它仍然会尝试尽可能靠近而不打破其他约束。因此,您的视图将处于其最大宽度,并在窗口中居中。
瞧!
【讨论】:
这是我在堆栈溢出中收到的最佳答案。非常感谢你。添加多个前导和尾随约束是我无法考虑的部分。干杯。以上是关于调整窗口大小时带有约束的宽度限制的主要内容,如果未能解决你的问题,请参考以下文章