如何禁用 MacCatalyst 上的全屏按钮

Ole*_*leg 2 macos swift swiftui mac-catalyst

macCatalyst 上的 UIWindow 带有关闭、最小化和全屏按钮

目前,我有这个停止调整窗口大小:

#if targetEnvironment(macCatalyst)
windowScene.sizeRestrictions?.minimumSize = CGSize(width: 480, height: 900)
windowScene.sizeRestrictions?.maximumSize = CGSize(width: 480, height: 900)
#endif

let window = UIWindow(windowScene: windowScene)
window.rootViewController = UIHostingController(rootView: contentView)
self.window = window
window.makeKeyAndVisible()
Run Code Online (Sandbox Code Playgroud)

但是全屏按钮无论如何都会使其全屏。

pom*_*mmy 6

这是另一种不需要 Objective-C、选择器或异步调用的方法。它也不需要目标宏,iOS 将简单地跳过if let NSApplication. 将其粘贴到首先出现的视图控制器中。请注意,这会禁用所有窗口上的绿色全屏按钮。如果你想区分,使用来自 Asperi 的 Swift 部分的想法。

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    func bitSet(_ bits: [Int]) -> UInt {
        return bits.reduce(0) { $0 | (1 << $1) }
    }

    func property(_ property: String, object: NSObject, set: [Int], clear: [Int]) {
        if let value = object.value(forKey: property) as? UInt {
            object.setValue((value & ~bitSet(clear)) | bitSet(set), forKey: property)
        }
    }

    // disable full-screen button
    if  let NSApplication = NSClassFromString("NSApplication") as? NSObject.Type,
        let sharedApplication = NSApplication.value(forKeyPath: "sharedApplication") as? NSObject,
        let windows = sharedApplication.value(forKeyPath: "windows") as? [NSObject]
    {
        for window in windows {
            let resizable = 3
            property("styleMask", object: window, set: [], clear: [resizable])
            let fullScreenPrimary = 7
            let fullScreenAuxiliary = 8
            let fullScreenNone = 9
            property("collectionBehavior", object: window, set: [fullScreenNone], clear: [fullScreenPrimary, fullScreenAuxiliary])
        }
    }
}
Run Code Online (Sandbox Code Playgroud)