如何在 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 改变,如何在导航栏中固定按钮的位置