Swift中如何追踪mouseDown与mouseUp事件时长?是否需手动实现追踪器?
在Swift中追踪mouseDown与mouseUp的时间间隔
嘿,这个问题问得很实际!在Swift的macOS开发场景下(毕竟iOS是触摸事件体系),系统并没有提供直接返回这两个事件时间间隔的现成API,所以确实需要我们手动实现一个简单的时间追踪逻辑来搞定这件事。
其实实现起来非常直观,只需要几个步骤:
定义时间戳存储变量
在你的NSView子类(或者关联的视图控制器对应的view中),添加一个可选类型的Date变量,用来记录mouseDown事件触发的时间:private var mouseDownTimestamp: Date?记录mouseDown的时间
重写mouseDown(with:)方法,在事件触发时把当前时间存入刚才定义的变量:override func mouseDown(with event: NSEvent) { super.mouseDown(with: event) mouseDownTimestamp = Date() // 这里可以添加你原本需要在mouseDown中执行的业务逻辑 }计算并获取时间间隔
接着重写mouseUp(with:)方法,在这里取出之前记录的时间戳,和当前时间做差值计算,就能得到两个事件之间的时间间隔了:override func mouseUp(with event: NSEvent) { super.mouseUp(with: event) guard let downTime = mouseDownTimestamp else { return } // 计算时间间隔(单位:秒) let pressDuration = Date().timeIntervalSince(downTime) print("鼠标按下到抬起的时长:\(pressDuration) 秒") // 记得重置时间戳,避免后续触发错误的计算 mouseDownTimestamp = nil // 添加你原本需要在mouseUp中执行的业务逻辑 }
额外注意事项
- 如果用户按下鼠标后,将鼠标移出当前视图再抬起,这时候
mouseUp事件可能不会在当前视图触发,导致时间戳一直存在。这种情况可以结合mouseExited(with:)或者mouseDragged(with:)方法,在合适的时机重置mouseDownTimestamp,避免无效的时间记录。 - 如果是iOS开发场景,对应的触摸事件是
touchesBegan(_:with:)和touchesEnded(_:with:),核心逻辑完全一致,只需要替换事件方法名即可。
内容的提问来源于stack exchange,提问作者Joel Tecson
相关产品推荐
相关产品推荐

