制作我在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是一个近似值,因为我不知道我是否在正确的轨道上。我正在寻找正确的公式。
有什么想法吗?
提前感谢!
1条答案
按热度按时间oiopk7p51#
我相信你已经接近了
CGDisplayScreenSize().width
提供以mm为单位的物理宽度。CGDisplayBounds().width
提供像素的宽度数。1英寸= 25.4毫米
因此:
let pixelsPerInch = CGDisplayBounds().width / ( CGDisplayScreenSize().width / 25.4 ))
...以及...let distance = deltaY / pixelsPerInch