【问题标题】:How to compute the real window size in Mac Catalyst in macOS 11如何在 macOS 11 中计算 Mac Catalyst 中的实际窗口大小
【发布时间】:2021-02-26 19:19:00
【问题描述】:

我使用 Mac Catalyst 将游戏移植到 macOS。游戏内容不会动态调整大小,因此我在应用程序开始时强制使用固定的 3:4 纵横比(如 iPad 纵向)。我将此添加到我的 AppDelegate 类中:

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        #if targetEnvironment(macCatalyst)
                        /* some margin */
            let titleHeight: CGFloat = 34 * 4
            UIApplication.shared.connectedScenes.compactMap { $0 as? UIWindowScene }.forEach { windowScene in
                windowScene.titlebar?.titleVisibility = .hidden
                /* screen was always 1920x1080 in macOS Catalina */
                let height = windowScene.screen.nativeBounds.height - titleHeight
                let width = 3 * height / 4
                windowScene.sizeRestrictions?.minimumSize = CGSize(width: width, height: height)
                windowScene.sizeRestrictions?.maximumSize = CGSize(width: width, height: height)
            }
        #endif
    }

这可以解决问题,但在 15 英寸 MacBook Pro 中,窗口看起来很小。 Apple 确认 Catalina 总是报告1920x1080read here

在已修复的 macOS 11 中,现在在 15 英寸 MacBook Pro 中,对于默认的 Retina 显示设置,我得到:

nativeBounds: 3360x2100
bounds: 1680x1050
nativeScale: 2
scale: 2

但是,如果我将 sizeRestrictions 中的高度固定为 1050,则窗口太短。如果我将它设置为 2100,则窗口大约比屏幕高 30% 并且超出范围。

我在UI Guidelines 中读到,Mac Catalyst 应用程序缩小了 77%,因此大约 1400 的高度似乎在这里工作。有没有办法以编程方式获得这种规模?

目前,我在代码中硬编码了1.3 * screen.bounds.height。不过,我不是 100% 正确的 sizeRestrictions 值,或者它恰好在这个屏幕上。

【问题讨论】:

    标签: mac-catalyst macos-big-sur


    【解决方案1】:

    我认为你最好的办法是破解设置 NSWindow 的 contentAspectRatio 属性的方法,这会将你的内容锁定为你想要的纵横比。 (还有一个NSWindow.contentRatio 属性,它将限制窗口的 大小,但我认为contentAspectRatio 是你想要的。)

    1. 获取Dynamic library 以简化以下操作。

    2. 从您当前的 UIWindow 中获取 AppKit NSWindow:

    extension UIWindow {
        var nsWindow: NSObject? {
            var nsWindow = Dynamic.NSApplication.sharedApplication.delegate.hostWindowForUIWindow(self)
            if #available(macOS 11, *) {
                nsWindow = nsWindow.attachedWindow
            }
            return nsWindow.asObject
        }
    }
    
    1. 一旦window.nsWindow 不为零(您可能需要等待 viewDidAppear),请将其 contentAspectRatio 设置为 4:3:
    Dynamic(view.window?.nsWindow).contentAspectRatio = CGSize(width: 4, height: 3)
    

    【讨论】:

    • 我应该提一下:Dynamic 让这在 Swift 中变得很容易。如果您使用的是 Objective-C(或者不介意桥接到 ObjC),那么上面的所有代码都可以使用 NSClassFromString 轻松完成。
    猜你喜欢
    • 2020-01-29
    • 2022-11-28
    • 2019-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-17
    • 1970-01-01
    • 2011-12-26
    相关资源
    最近更新 更多