【问题标题】:Mouse moved events during button mouse up event按钮鼠标向上事件期间的鼠标移动事件
【发布时间】:2020-05-12 18:08:23
【问题描述】:

我想在按钮单击(鼠标向上)期间接收有关鼠标移动事件的信息

我正在添加 NSTrackingArea 以查看我想要跟踪鼠标移动和鼠标拖动事件,但我仍然没有收到这些事件。

我假设NSButton 中的mouseDown 阻止了鼠标事件,所以我想出的唯一解决方案是覆盖NSButtonmouseDown 函数而不是调用super.mouseDown,但是我需要处理按钮手动选择,我不确定这是否是正确的方法。

这是解决我的问题的正确方法吗?会不会有问题?有没有更好的解决方案?

这是测试代码,只需将按钮添加到新项目并为其分配TestButton 类。

class TestButton: NSButton {

    override func mouseDown(with event: NSEvent) {
        print("Mouse up")
        super.mouseDown(with: event) // After removing events works.
        print("Mouse down")
    }
}

class ViewController: NSViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let trackingArea = NSTrackingArea(rect: view.bounds, options: [.activeAlways, .mouseMoved, .enabledDuringMouseDrag], owner: self, userInfo: nil)
        view.addTrackingArea(trackingArea)
    }

    override func mouseMoved(with event: NSEvent) {
        print("Mouse moved")
        super.mouseMoved(with: event)
    }

    override func mouseDragged(with event: NSEvent) {
        print("Mouse dragged")
        super.mouseDragged(with: event)
    }
}

【问题讨论】:

  • view.window 属性在viewDidLoad 方法中将始终为nil,因此使用可选投标将acceptsMouseMovedEvents 设置为true 将静默失败。您需要在viewWillAppearviewDidAppear 方法中设置此属性,其中view.window 不是nil
  • 感谢您的关注,我删除了这一行,因为它没有任何改变

标签: swift cocoa


【解决方案1】:

我的项目也有类似的要求。所以最初,我和你一样从 NSButton 开始。但是,事实证明它比我想象的要忙碌。处理我面临的主要问题的动作和选定状态。如果它确实符合您的要求,您可以继续使用 NSButton。但是,我最终转向了 NSView 并对其进行了定制。因此,我开源的处理移动和拖动事件实现的几个实现here 是链接。

【讨论】:

    【解决方案2】:

    执行此操作的传统方法是使用NSButtonCell 的自定义子类并覆盖continueTracking(last:current:in:)(继承自NSCell)。您的覆盖通常应该调用super 并返回它返回的内容,但您还可以执行其他操作,以响应鼠标移动。问题是NSCell 及其子类已经“软弃用”了一段时间。

    也就是说,作为用户,当我与按钮交互(单击并拖动)时,除了按钮之外的任何东西都会对鼠标移动做出反应,这让我感到非常惊讶。

    【讨论】:

      猜你喜欢
      • 2013-04-22
      • 2018-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-17
      相关资源
      最近更新 更多