isMovableByWindowBackground для SwiftUI MacCatalyst

Как мне получить доступ к атрибутам из 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()
        }
    }

1 ответ

Решение

Во-первых, вам понадобится динамическая библиотека от Mhd Hejazi. Его можно включить в ваш код с помощью 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

Не забудьте, что для импорта потребовались динамические. Также используйте методы и свойства Object-C, а не Swift.

Другие вопросы по тегам