为啥添加约束会消除调整 NSWindow 大小的能力?

Posted

技术标签:

【中文标题】为啥添加约束会消除调整 NSWindow 大小的能力?【英文标题】:Why adding constraints removes the ability to resize NSWindow?为什么添加约束会消除调整 NSWindow 大小的能力? 【发布时间】:2016-08-18 08:10:26 【问题描述】:

我正在尝试的只是添加一个 NSImageView 并在我调整其大小时使其填充窗口。

但是,一旦添加了约束,窗口就会失去调整大小的能力。

如果我添加

view.translatesAutoresizingMaskIntoConstraints  = false

约束也被忽略了。

谁能指出我做错了什么?

代码可以从here下载

【问题讨论】:

【参考方案1】:

首先,您的parentView 是窗口的contentView。我想不出我曾经干扰过这个视图的默认布局行为,所以我删除了parentView.translatesAutoresizingMaskIntoContraints = false 行。

其次,从外观上看,您所做想要对约束图像视图承担全部责任,因此对于此视图,您应该translatesAutoresizingMaskIntoContraints 设置为 false .

最后,除了您添加的约束之外,all NSView objects come with constraints that tell Auto Layout to what extent the view's content should effect how and whether it resizes。内容的含义因视图而异,但在您的情况下,它是 NSImage 对象。在您的代码中,您将获得默认行为,基本上是说不允许任何内容压缩 - 您需要更改它:

imageView.setContentCompressionResistancePriority(249, forOrientation: NSLayoutConstraintOrientation.Horizontal)
imageView.setContentCompressionResistancePriority(249, forOrientation: NSLayoutConstraintOrientation.Vertical) 

真的,除非您有令人信服的理由不这样做,否则您应该在 Interface Builder 中设置您的 NSImageView。 Interface Builder 不仅消除了行和行代码,还提供了实时调试帮助。例如,我通过注释掉所有代码并首先在 Interface Builder 中重做整个事情来回答这个问题。每当我选择图像视图时,就会出现橙色虚线警告线,这一问题是压缩约束问题的事实立即显而易见:

【讨论】:

以上是关于为啥添加约束会消除调整 NSWindow 大小的能力?的主要内容,如果未能解决你的问题,请参考以下文章

NSLayoutConstraint 防止 NSWindow 调整大小

NSTableView 意外调整大小

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

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

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

即使有约束,UIButton 图像也会自动调整大小