0

我使用 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 一直在报道1920x1080请在此处阅读

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

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

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

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

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

4

1 回答 1

1

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

  1. 获取动态库以简化以下操作。

  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)
于 2020-12-14T17:26:28.223 回答