为什么在设置约束后无法再调整 NSWindow 的大小?
Why is it not possible anymore to resize NSWindow after setting up constraints?
在自定义转场和自定义演示动画师之后,我设置了所呈现视图的约束。
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)
当我打印出parent/presenting viewcontroller 视图的约束时,只有这四个约束。现在我希望我的子视图像 NSWindow 一样可调整大小,但两者都不再可调整大小了。
我也试了一下translatesAutoresizingMaskIntoConstraint = false
,但不是很懂。此外,它会从视图中删除所有内容。
那么我在这里缺少什么?
听起来你的视图没有在内部使用自动布局。它依赖于旧的 springs-and-struts 模型。这就是为什么当您关闭 translatesAutoresizingMaskIntoConstraint
时它 "removes everything"。更有可能的是,视图正在折叠为零大小,因为不再有任何限制来保持其大小和位置。
当 translatesAutoresizingMaskIntoConstraint
启用时,会生成约束以将视图保持在为其明确设置的最后一帧。如果它的父视图调整大小并且父视图自动调整其子视图的大小(这是默认设置),则视图将根据其 autoresizingMask
调整大小。但是自动布局有点不知道会发生这种情况。生成的约束使框架保持原样,直到超级视图发生变化。
但是您还在 window 的内容视图和您的视图之间添加了约束。这些约束有效地阻止 window 调整大小,因为视图的约束不允许布局系统调整它的大小。只有对其框架进行显式更改才能做到这一点。你有点像第 22 条军规。如果调整其父视图的大小,视图将调整大小,但父视图无法调整大小,因为视图对其具有不灵活的约束。
一般来说,当您使用一个保留了 translatesAutoresizingMaskIntoConstraint
的视图时,您在可以有效地应用到该视图的其他约束方面会受到很大限制。您不能真正在视图的框架或大小上使用 "push" 的约束。您只能松散地 "hang" 离开该视图的其他视图。
在任何情况下,您都需要为您的视图采用自动布局,或者只是不要在它和它的父视图之间设置约束。取而代之的是依靠自动调整机制。
在自定义转场和自定义演示动画师之后,我设置了所呈现视图的约束。
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)
当我打印出parent/presenting viewcontroller 视图的约束时,只有这四个约束。现在我希望我的子视图像 NSWindow 一样可调整大小,但两者都不再可调整大小了。
我也试了一下translatesAutoresizingMaskIntoConstraint = false
,但不是很懂。此外,它会从视图中删除所有内容。
那么我在这里缺少什么?
听起来你的视图没有在内部使用自动布局。它依赖于旧的 springs-and-struts 模型。这就是为什么当您关闭 translatesAutoresizingMaskIntoConstraint
时它 "removes everything"。更有可能的是,视图正在折叠为零大小,因为不再有任何限制来保持其大小和位置。
当 translatesAutoresizingMaskIntoConstraint
启用时,会生成约束以将视图保持在为其明确设置的最后一帧。如果它的父视图调整大小并且父视图自动调整其子视图的大小(这是默认设置),则视图将根据其 autoresizingMask
调整大小。但是自动布局有点不知道会发生这种情况。生成的约束使框架保持原样,直到超级视图发生变化。
但是您还在 window 的内容视图和您的视图之间添加了约束。这些约束有效地阻止 window 调整大小,因为视图的约束不允许布局系统调整它的大小。只有对其框架进行显式更改才能做到这一点。你有点像第 22 条军规。如果调整其父视图的大小,视图将调整大小,但父视图无法调整大小,因为视图对其具有不灵活的约束。
一般来说,当您使用一个保留了 translatesAutoresizingMaskIntoConstraint
的视图时,您在可以有效地应用到该视图的其他约束方面会受到很大限制。您不能真正在视图的框架或大小上使用 "push" 的约束。您只能松散地 "hang" 离开该视图的其他视图。
在任何情况下,您都需要为您的视图采用自动布局,或者只是不要在它和它的父视图之间设置约束。取而代之的是依靠自动调整机制。