为什么在设置约束后不再能够调整NSWindow的大小?

时间:2015-07-21 01:44:41

标签: swift cocoa constraints nsview nslayoutconstraint

在自定义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 个答案:

答案 0 :(得分:1)

听起来您的视图内部没有使用自动布局。它依靠古老的弹簧和支柱模型。这就是为什么当你关闭translatesAutoresizingMaskIntoConstraint时它会删除所有内容"。更有可能的是,视图折叠为零大小,因为没有限制来保持其大小和位置。

translatesAutoresizingMaskIntoConstraint打开时,会生成约束以将视图保持在为其显式设置的最后一帧。如果超级视图调整大小并且超级视图自动调整其子视图(这是默认值),则视图将根据其autoresizingMask进行调整大小。但是自动布局并不知道会发生什么。生成的约束使帧保持不变,直到超级视图发生变化。

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

通常情况下,当您处理剩余translatesAutoresizingMaskIntoConstraint的视图时,您可以非常有限地使用其他约束来有效地应用于该视图。你不能真正使用" push"在视图的框架或大小上。你只能松散地"挂"该观点的其他观点。

在任何情况下,您都需要为视图采用自动布局,或者不要在其与超级视图之间设置约束。而是依赖于自动调整机制。