为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