如何在 Mac 催化剂中固定窗口的位置?

Posted

技术标签:

【中文标题】如何在 Mac 催化剂中固定窗口的位置?【英文标题】:How to fix the position of the window in Mac catalyst? 【发布时间】:2020-06-25 19:30:04 【问题描述】:

每次我打开我的项目时,它都会在窗口中的随机位置打开。我想固定位置,例如它的框架 (x,y,width,height ) 这可能吗?

【问题讨论】:

【参考方案1】:

你应该看看 Mhd Hajezi 的动态 library。

你首先需要一个 UIWindow 的扩展:

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

将以下内容放入您的场景委托中(此处显示),或者在窗口实例化后您可以访问的某个位置(例如 someView.window!)

    let ns = self.window?.nsWindow
    Dynamic(ns!).setFrame(CGRect(250,200,1200,800), display: true)
    let frame = Dynamic(ns!).frame.asCGRect!
    let size = frame.size
    Dynamic(ns!).setAspectRatio(CGSize(1.0, size.height/size.width))

最后两行强制调整窗口大小时纵横比保持不变。所有暴露的方法都是objective-C方法。注意位置是左下角。查看 NSWindow documentation 调整窗口大小和内容。

【讨论】:

如何设置SPM? 查看 Hajezi 的 repo 以获取说明。 这段代码什么时候起作用。需要确保它在窗口被实例化并且可见之后。看我后续的回答 如果我们使用这个lib(Dynamic),应用程序会被Apple拒绝吗?【参考方案2】:

我有一个名为 utility.swift 的文件,它位于:

    func delay(_ delay: Double, closure: @escaping () -> ())   
        let when = DispatchTime.now() + delay
        DispatchQueue.main.asyncAfter(deadline: when, execute: closure)
    

然后在与窗口关联的场景委托中:

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) 
        // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
        // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
        // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
        guard let sceneWindow = (scene as? UIWindowScene) else  return 
        #if targetEnvironment(macCatalyst)
        sceneWindow.sizeRestrictions?.minimumSize = CGSize(width: 1570, height: 1000) // optimal minumum
        window = Window(frame: sceneWindow.coordinateSpace.bounds)
        #else
        window = UIWindow(frame: sceneWindow.coordinateSpace.bounds)
        #endif
        window?.windowScene = sceneWindow
        window?.windowScene?.delegate = self
        window?.rootViewController = ViewController()
        window?.makeKeyAndVisible()
        let app = UIApplication.shared.delegate as! AppDelegate

        app.doApp(window: window!)
        
        #if targetEnvironment(macCatalyst)
        delay(0) 
            let ns = self.window?.nsWindow
            Dynamic(ns!).setFrame(CGRect(200,200,1200,800), display: true)
            let frame = Dynamic(ns!).frame.asCGRect!
            let size = frame.size
            Dynamic(ns!).setAspectRatio(CGSize(1.0, size.height/size.width))
        
        #endif

Window 只是 UIWIndow 的一个子类,带有一些特定于应用程序的变量。 ViewCONtroller 也一样。

【讨论】:

doApp 是什么? doApp 只是我的应用程序中用于设置所有子视图的一堆代码。回到 Scenes 之前,它是 AppDelegate 的一部分。应用

以上是关于如何在 Mac 催化剂中固定窗口的位置?的主要内容,如果未能解决你的问题,请参考以下文章

如何在ipad和iphone中固定背景图像不滚动位置固定[重复]

即使屏幕尺寸在 Dash-plotly 中使用 python 改变,如何在导航栏中固定按钮的位置

当基于场景的文档mac催化剂应用程序在应用程序重启时重新打开窗口时如何避免奇怪的行为?

Firefox 7.0.1 中固定位置元素的奇怪边框

jQuery 动画位置在 Firefox 中固定不准确

滚动时如何在 UIScrollView 中固定图像/视图