【问题标题】:isMovableByWindowBackground for SwiftUI MacCatalystSwiftUI MacCatalyst 的 isMovableByWindowBackground
【发布时间】:2020-06-12 20:17:29
【问题描述】:

如何从 NSWindow 访问 SwiftUI Catalyst 应用程序的属性?例如,允许通过 NSWindow.moveableByWindowBackground 拖动窗口背景来移动窗口。

我已经在 SceneDelegate.swift 中指定了基础知识。

import UIKit
import SwiftUI

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

        let app = UIApplication.shared
        let delegate = app.delegate as! AppDelegate
        if let windowScene = scene as? UIWindowScene {
            let window = UIWindow(windowScene: windowScene)

            #if targetEnvironment(macCatalyst)
            if let titlebar = windowScene.titlebar {
                titlebar.titleVisibility = .hidden
                titlebar.toolbar = nil
            }
            if let sizeRestrictions = windowScene.sizeRestrictions {
                sizeRestrictions.minimumSize = CGSize(width: 1300, height: 800)
            }
            window.canResizeToFitContent = true
            #endif

            window.rootViewController = UIHostingController(rootView: GreatHallView(screenerVM: delegate.screenerVM).environmentObject(SortingHat()))
            self.window = window
            window.makeKeyAndVisible()
        }
    }

【问题讨论】:

    标签: swiftui nswindow mac-catalyst


    【解决方案1】:

    首先,您需要来自 Mhd Hejazi 的 Dynamic library。它可以通过 SPM 包含在您的代码中。

    接下来,一个 UIWindow 的扩展:

        extension UIWindow {
            var nsWindow: NSObject? {
                Dynamic.NSApplication.sharedApplication.delegate.hostWindowForUIWindow(self)
            }
        }
    

    现在您可以将 NSWindow 与 UIWindow 关联并调用方法并提取属性,如下所示:

        #if targetEnvironment(macCatalyst)
        let ns = window.nsWindow
        let frame = Dynamic(ns!).frame.asCGRect!
        let size = frame.size
        Dynamic(ns!).setAspectRatio(CGSize(1.0, size.height/size.width))
        print(Dynamic(ns!).isMovableByWindowBackground.asBool!)
        Dynamic(ns!).setMovableByWindowBackground(true)
        print(Dynamic(ns!).isMovableByWindowBackground.asBool!)
        #endif
    

    记得导入 Dynamic 是必需的。此外,请使用 Object-C 方法和属性,而不是 Swift。

    【讨论】:

      猜你喜欢
      • 2020-03-23
      • 2023-04-08
      • 2021-03-22
      • 1970-01-01
      • 2020-12-10
      • 1970-01-01
      • 1970-01-01
      • 2020-03-20
      • 1970-01-01
      相关资源
      最近更新 更多