如何找到不使 window 大于屏幕尺寸的视图的最大尺寸?

How to find the largest size of a view that does not make window larger than screen size?

我正在开发一个需要显示大图像的 MacOS 应用程序。如果我天真地将 ImageView 设置为全尺寸图像,应用程序的 window 可能会被迫变得大于屏幕尺寸。我想做的是计算出在屏幕上保留整个 window(其中还包含其他 UI 元素)的情况下我可以制作多大的图像。

我知道我可以使用 NSScreen:visibleFrame() 查询可用屏幕的数量 space 但这似乎没有太大帮助,因为除非我对多少 space UI 的其余部分将占据,然后破坏了具有基于约束的 UI 布局的要点。

另一种方法可能是找到一种方法来限制 window 大小,然后让 Cocoa 计算出视图的大小。但是,Xcode 中的 UI 编辑器似乎只允许指定静态大小,这没什么帮助。

看起来这在 Swift 中是可行的UI (https://www.hackingwithswift.com/quick-start/swiftui/how-to-adjust-the-way-an-image-is-fitted-to-its-space)

Image("example-image")
   .resizable()
   .aspectRatio(contentMode: .fit)

但是,我正在处理的应用程序需要 运行 在比 Swift UI 支持的旧版本的 MacOS 上运行,所以我需要知道如何在 swift 中执行此操作但使用普通 Cocoa.

我要尝试的第一件事是修改使图像视图足够大以容纳图像的约束的优先级。那将是它的 content compression resistance priority。我想如果你将它设置为 .dragThatCanResizeWindow 那么你可能会免费获得你想要的行为。这是因为当您拖动它的边缘时,系统已经将 window 限制为屏幕尺寸。因此,据推测,该隐式约束的优先级高于 .dragThatCanResizeWindow.

如果不行,您可以通过设置 window 的 maxSize property 以编程方式设置其最大帧大小。每次屏幕配置更改或 window 移动到不同的屏幕时,您都需要进行设置。对于前者,可以观察NSApplication.didChangeScreenParametersNotification。对于后者,您的 window 委托可以实现 windowDidChangeScreen(_:) 或者您可以观察 NSWindow.didChangeScreenNotification.