1

当我使用调整它的大小时,我已经能够获得一个场景窗口的大小

func windowScene(_ windowScene: UIWindowScene, didUpdate previousCoordinateSpace: UICoordinateSpace, interfaceOrientation previousInterfaceOrientation: UIInterfaceOrientation, traitCollection previousTraitCollection: UITraitCollection) {
        print("movement trapped \(windowScene.coordinateSpace.bounds)"
}

在场景委托内。但无论我将窗口拖到哪里,x,y 坐标始终为 0,0。希望能够指示新的场景窗口相对于“默认”场景窗口在 Mac 屏幕上的位置。

4

2 回答 2

0

您可以尝试将窗口框架从 windowScene 坐标空间转换为 UIScreen 坐标空间

windowFrame = [window convertRect:window.frame toCoordinateSpace:window.windowScene.screen.coordinateSpace];
于 2019-12-08T13:52:40.193 回答
0

出色地

我没有找到在 UIWindow 中完成此操作的方法,但请记住,Catalyst 确实支持 AppKit,您可以随时使用 objc 运行时调用它。


于是想到了这个主意:

  • 从 NSApplication 获取 NSWindows
  • 从 view.window 获取 UIWindow
  • 比较一些魔法并查找我们的目标 NSWindow
  • 获取该 NSWindow 的框架
var targetNSWindow: AnyObject? = nil
let nsWindows = (NSClassFromString("NSApplication")?.value(forKeyPath: "sharedApplication.windows") as? [AnyObject])!
for nsWindow in nsWindows {
    let uiWindows = nsWindow.value(forKeyPath: "uiWindows") as? [UIWindow] ?? []
    if uiWindows.contains(view.window!) {
        targetNSWindow = nsWindow
    }
}
if let found = targetNSWindow {
    print(found.value(forKeyPath: "_frame")!)
}

这是一个示例输出。

NSRect: {{818, 296}, {964, 614}}

再多一点,您可以从 sceneDelegate 中获取您的窗口信息,并以类似的方式将其与魔法进行比较。但要小心,有时当应用程序刚加载时你没有任何窗口。如果发生这种情况,请执行 DispatchQueue.main.async 块中的作业。

于 2020-05-29T12:53:59.230 回答