如何在Swift中将CGDisplayBounds()中的位置转换为全局坐标(如NSEvent.mouseLocation)

wvmv3b1j  于 2023-02-11  发布在  Swift
关注(0)|答案(1)|浏览(102)

我是Swift和MacOS的新手,我会找到一个方法来获得精确的显示坐标

NSEvent.mouseLocation

我在CoreGraphic中找到了方法:

func CGDisplayBounds(_ display: CGDirectDisplayID) -> CGRect

但是坐标不同。

我可以变通地应用一种方法到数学方法来转换点Y。但是有没有任何方法可以通过编程来获取或转换位置?

我希望使用NSEvent.mouseLocation获得相同的坐标。

谢谢大家的关注。
它将返回到与鼠标位置相同的坐标。

fdbelqdn

fdbelqdn1#

正如你所注意到的,CoreGraphics拥有苹果所谓的"翻转"几何结构,原点位于屏幕左上方,y坐标向屏幕底部递增。这是大多数计算机图形系统使用的几何结构。
AppKit更喜欢苹果所谓的"非翻转",原点在左下方,y坐标朝屏幕顶部递增,这是数学中常用的几何图形。
CoreGraphics全局几何图形的原点(0,0)始终位于"主"显示屏的左上方(由CGMainDisplayID()标识)。AppKit全局几何图形的原点始终位于主显示屏的左下方。要在两个几何图形之间转换,请从主显示屏的高度中减去y坐标。
即:

extension CGPoint {
    func convertedToAppKit() -> CGPoint {
        return .init(
            x: x,
            y: CGDisplayBounds(CGMainDisplayID()).height - y
        )
    }

    func convertedToCoreGraphics() -> CGPoint {
        return .init(
            x: x,
            y: CGDisplayBounds(CGMainDisplayID()).height - y
        )
    }
}

你可能会注意到这两个函数有相同的实现,你并不真的需要两个函数;你可以只使用一个。它可以双向转换。
调用CGDisplayBounds(CGMainDisplayID())也可能是低效的。如果你要做很多转换,你可能需要缓存值或者批处理转换。但是如果你缓存值,你需要订阅NSApplication.didChangeScreenParametersNotification,这样你就可以在需要改变的时候更新缓存的值。

相关问题