Objective c 使用“半固定”纵横比调整窗口大小

Objective c 使用“半固定”纵横比调整窗口大小,objective-c,macos,swift,autolayout,Objective C,Macos,Swift,Autolayout,我希望瓷砖有意义。。。我试图使我的NSWindow的大小受其内容的限制,这是一个具有固定纵横比的视图,底部有一个间距,如图所示 从ContextBackedView到superview,前导、尾随和顶部空间等于0,底部空间等于37,加上纵横比约束418:263 以下是constraintsAffectingLayoutForOrientation 0x6000001217c0的输出是窗口内容视图 NSLayoutConstraintionHorizontal‌ <NSAutoresizin

我希望瓷砖有意义。。。我试图使我的NSWindow的大小受其内容的限制,这是一个具有固定纵横比的视图,底部有一个间距,如图所示

从ContextBackedView到superview,前导、尾随和顶部空间等于0,底部空间等于37,加上纵横比约束418:263

以下是constraintsAffectingLayoutForOrientation 0x6000001217c0的输出是窗口内容视图 NSLayoutConstraintionHorizontal‌

<NSAutoresizingMaskLayoutConstraint:0x618000080af0 h=-&- v=-&- H:|-(0)-[NSView:0x6000001217c0]   (Names: '|':NSThemeFrame:0x1003060c0'Window' )>,
<NSAutoresizingMaskLayoutConstraint:0x618000080b40 h=-&- v=-&- H:[NSView:0x6000001217c0]-(0)-|   (Names: '|':NSThemeFrame:0x1003060c0'Window' )>,
<NSLayoutConstraint:0x618000080870 'NSWindow-current-width' H:[NSThemeFrame:0x1003060c0'Window'(418@500)] priority:500>
NSLayoutConstraintionVertical

<NSAutoresizingMaskLayoutConstraint:0x618000080af0 h=-&- v=-&- H:|-(0)-[NSView:0x6000001217c0]   (Names: '|':NSThemeFrame:0x1003060c0'Window' )>,
<NSAutoresizingMaskLayoutConstraint:0x618000080b40 h=-&- v=-&- H:[NSView:0x6000001217c0]-(0)-|   (Names: '|':NSThemeFrame:0x1003060c0'Window' )>,
<NSLayoutConstraint:0x6000000828a0 H:[NSView:0x600000121860]-(0)-|   (Names: '|':NSView:0x6000001217c0 )>,
<NSLayoutConstraint:0x600000082990 H:|-(0)-[NSView:0x600000121860]   (Names: '|':NSView:0x6000001217c0 )>,
<NSLayoutConstraint:0x618000080870 'NSWindow-current-width' H:[NSThemeFrame:0x1003060c0'Window'(418@500)] priority:500>,
<NSAutoresizingMaskLayoutConstraint:0x618000080b90 h=-&- v=-&- V:[NSView:0x6000001217c0]-(0)-|   (Names: '|':NSThemeFrame:0x1003060c0'Window' )>,
<NSLayoutConstraint:0x6000000828f0 V:|-(0)-[NSView:0x600000121860]   (Names: '|':NSView:0x6000001217c0 )>,
<NSLayoutConstraint:0x600000082940 V:[NSView:0x600000121860]-(37)-|   (Names: '|':NSView:0x6000001217c0 )>,
<NSLayoutConstraint:0x6000000800f0 NSView:0x600000121860.width == 1.58935*NSView:0x600000121860.height>
使用自动布局,它只在我调整窗口宽度时起作用,但在我尝试更改窗口高度时不起作用。 我不能使用-[NSWindow setAspectRatio:],因为窗口的比率实际上不是一个固定的数字,因为底部空间必须保持不变

我也尝试过使用-windowWillResize:toSize:但我找不到可靠的方法使其工作,只调整宽度或高度是可以的,但当同时更改这两个值时,它通常会断开


有人知道实现这一点的方法吗?

如果在ContextBackedView中添加一个约束纵横比约束,并且倍增属性是您想要的纵横比,例如4:3,您应该能够实现您想要的

如果您是通过IB构建的,这很容易-首先选择您的ContextBackedView,然后在右下角单击带有线条图标的框,然后选择纵横比。这将在调整大小后保持视图的当前纵横比


如果您希望以编程方式执行此操作,则必须研究如何实例化NSLayoutConstraints并将其应用于NSView。我从来没有在纵横比约束下这样做过,但它应该是非常直接的。如果您想要一个代码示例,请告诉我我可以旋转一个:

当您尝试更改窗口高度时会发生什么?它只是没有调整大小…您的屏幕截图似乎掩盖了一些限制。可以折叠对象库视图。或者在你的问题或其他东西中用文字解释限制。我已经更新了屏幕截图+添加了描述。我不熟悉故事板以及视图如何约束到窗口的内容视图,或者视图是否成为窗口的内容视图?。在运行时记录[window.contentView constraintsAffectingLayoutForOrientation:NSLayoutConstraintOrientationHorizontal]和[window.contentView constraintsAffectingLayoutForOrientation:NSLayoutConstraintOrientation:NSLayoutConstraintOrientationVertical]可能会提供一些信息。如果查看屏幕截图,您可以看到我已经添加了该约束。。。问题不是调整视图的大小,而是窗口的大小……哦,对不起,我刚刚制作了一个示例应用程序,并让它调整大小;但忽略了仔细观察你的形象。是我的错。因此,我要做的是将一个自定义视图作为底部栏,在其上设置高度约束,然后将该视图的顶部设置为约束距顶部视图底部的距离0。我明天会再检查一遍,我试着在底部放置另一个视图,而不是让空间空着,但这似乎并不重要,除非底部栏你指的是一个实际的栏,但我找不到一种方法我制作了一个快速视频,这就是你要找的功能吗?是的,正如你所看到的,你不能通过改变高度来调整窗口的大小,只能改变宽度,或者从拐角处同时改变宽度。。。