xcode 计算从scrollWheel NSEvent滚动的物理距离

bogh5gae  于 2022-12-14  发布在  其他
关注(0)|答案(1)|浏览(125)

制作我在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是一个近似值,因为我不知道我是否在正确的轨道上。我正在寻找正确的公式。
有什么想法吗?
提前感谢!

oiopk7p5

oiopk7p51#

我相信你已经接近了
CGDisplayScreenSize().width提供以mm为单位的物理宽度。
CGDisplayBounds().width提供像素的宽度数。
1英寸= 25.4毫米
因此:
let pixelsPerInch = CGDisplayBounds().width / ( CGDisplayScreenSize().width / 25.4 )) ...以及...
let distance = deltaY / pixelsPerInch

相关问题