You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中如何追踪mouseDown与mouseUp事件时长?是否需手动实现追踪器?

在Swift中追踪mouseDown与mouseUp的时间间隔

嘿,这个问题问得很实际!在Swift的macOS开发场景下(毕竟iOS是触摸事件体系),系统并没有提供直接返回这两个事件时间间隔的现成API,所以确实需要我们手动实现一个简单的时间追踪逻辑来搞定这件事。

其实实现起来非常直观,只需要几个步骤:

  1. 定义时间戳存储变量
    在你的NSView子类(或者关联的视图控制器对应的view中),添加一个可选类型的Date变量,用来记录mouseDown事件触发的时间:

    private var mouseDownTimestamp: Date?
    
  2. 记录mouseDown的时间
    重写mouseDown(with:)方法,在事件触发时把当前时间存入刚才定义的变量:

    override func mouseDown(with event: NSEvent) {
        super.mouseDown(with: event)
        mouseDownTimestamp = Date()
        // 这里可以添加你原本需要在mouseDown中执行的业务逻辑
    }
    
  3. 计算并获取时间间隔
    接着重写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:11:18