为啥设置约束后不能再调整 NSWindow 的大小?

Posted

技术标签:

【中文标题】为啥设置约束后不能再调整 NSWindow 的大小?【英文标题】:Why is it not possible anymore to resize NSWindow after setting up constraints?为什么设置约束后不能再调整 NSWindow 的大小? 【发布时间】:2015-07-21 01:44:40 【问题描述】:

在自定义 segue 和自定义演示动画师之后,我设置了呈现视图的约束。

let views = ["view" : childVC.view]
let horizontalConstraints = NSLayoutConstraint.constraintsWithVisualFormat("H:|[view]|", options: [], metrics: nil, views: views)
let verticalConstraints = NSLayoutConstraint.constraintsWithVisualFormat("V:|[view]|", options: [], metrics: nil, views: views)
parentVC.view.addConstraints(horizontalConstraints)
parentVC.view.addConstraints(verticalConstraints)

当我打印出父/呈现视图控制器视图的约束时,只有这四个约束。现在我希望我的子视图与 NSWindow 一样可调整大小,但两者都不再可调整大小了。

我也试试translatesAutoresizingMaskIntoConstraint = false,但我不是很懂。此外,它会从视图中删除所有内容。

那么我在这里缺少什么?

【问题讨论】:

【参考方案1】:

听起来您的视图内部没有使用自动布局。它依赖于旧的弹簧和支柱模型。这就是为什么当您关闭 translatesAutoresizingMaskIntoConstraint 时它会“删除所有内容”。更有可能的是,视图正在折叠到零大小,因为不再有约束来保持其大小和位置。

translatesAutoresizingMaskIntoConstraint 开启时,会生成约束以将视图保持在为其明确设置的最后一帧。如果它的超级视图调整大小并且超级视图自动调整其子视图的大小(这是默认设置),则视图将根据其autoresizingMask 调整大小。但是自动布局有点不知道会发生这种情况。生成的约束使框架保持原样,直到父视图发生变化。

但是您还在窗口的内容视图和您的视图之间添加了约束。这些约束有效地阻止了窗口调整大小,因为视图的约束不允许布局系统调整它的大小。只有对其框架进行显式更改才能做到这一点。你有点在catch-22中。如果父视图调整大小,视图将调整大小,但父视图无法调整大小,因为视图对其具有不灵活的约束。

一般来说,当您使用保留有translatesAutoresizingMaskIntoConstraint 的视图时,您在可以有效地应用于该视图的其他约束方面受到很大限制。您不能真正使用“推动”视图框架或大小的约束。您只能从该视图松散地“挂起”其他视图。

在任何情况下,您都需要为您的视图采用自动布局,或者只是不要在它与其父视图之间设置约束。而是依靠自动调整大小机制。

【讨论】:

这听起来对我来说几乎可以理解。我不明白的是,为什么我的 NSVisualEffect 视图对内容视图的相同约束使窗口保持可调整大小。我能看到的唯一区别是 NSVisualEffect 视图是通过 IB 而不是通过代码设置的。 对于启用了自动布局的 NIB 或情节提要,IB 会为所有视图关闭 translatesAutoresizingMaskIntoConstraint(任何独立的***视图除外,它由您决定)。 我的错误是,我将translatesAutoresizingMaskIntoConstraints = false 设置为内容视图而不是子视图。现在一切正常。

以上是关于为啥设置约束后不能再调整 NSWindow 的大小?的主要内容,如果未能解决你的问题,请参考以下文章

NSLayoutConstraint 防止 NSWindow 调整大小

在 NSWindow 手动调整大小之前,NSTableView 不会布局/调整列大小

为啥我不能再调整视图大小了?

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

NSWindow - 调整大小时缩放所有内容

NSTableView 意外调整大小