计算从滚动轮NSEvent滚动的物理距离



为macOS制作我的第一个Swift应用程序。边学习边学习。。。

我正在尝试制作一个应用程序,它可以计算从滚动轮NSEvent处理程序滚动的总物理距离。我正在使用此代码附加事件处理程序:

NSEvent.addGlobalMonitorForEvents(matching: NSEvent.EventTypeMask.scrollWheel, handler: self.scrollWheel);

我使用let deltaY = abs(event.scrollingDeltaY)在事件处理程序中获得绝对deltaY值

我猜deltaY是以点为单位报告的,但我如何将其转换为物理距离(以英寸为单位)?

我正在使用以下代码手动计算用户设备的ppi:

let width = NSScreen.main?.frame.width ?? 0
let height = NSScreen.main?.frame.height ?? 0

let diagonal = sqrt(pow(width, 2) + pow(height, 2))
let pixelsPerInch = ((width / CGDisplayScreenSize(CGMainDisplayID()).width) * 25.4) * CGFloat(NSScreen.main?.backingScaleFactor ?? 0

我使用这个公式来计算滚动的物理距离(以英寸为单位)。

let distance = deltaY *  1 / pixelsPerInch * 40

这个公式是硬编码的,显然是错误的。乘以40是一个近似值,因为我不知道我是否在正确的轨道上。我正在寻找合适的配方。

有什么想法吗?

提前感谢!

我相信你已经接近

CGDisplayScreenSize().width提供以毫米为单位的物理宽度。
CGDisplayBounds().width提供像素的宽度数
1英寸=25.4毫米

因此:
let pixelsPerInch = CGDisplayBounds().width / ( CGDisplayScreenSize().width / 25.4 ))…和…
let distance = deltaY / pixelsPerInch

相关内容

  • 没有找到相关文章

最新更新