【问题标题】:MouseMoved function is never called永远不会调用 MouseMoved 函数
【发布时间】:2020-11-27 22:41:50
【问题描述】:

我正在尝试覆盖 NSViewController 中的 mouseMoved 函数。

import Cocoa

class MainViewController: NSViewController {

override var acceptsFirstResponder: Bool {get {return true} }

@IBOutlet var background: RandomNumberBackground!
override func viewDidLoad() {
    super.viewDidLoad() 
}

override func awakeFromNib() {
    NSTimer.scheduledTimerWithTimeInterval(0.04, target: background, selector: "updateNumbers", userInfo: nil, repeats: true)
}

@IBAction func btnLevelClicked(sender: AnyObject) {
      self.presentViewControllerAsSheet(LevelScrollController())
}

override func mouseMoved(theEvent: NSEvent) {
    Swift.print("MOVED!")
}

}

我已经覆盖了acceptsFirstResponder,但从未调用过mouseMoved。为什么?我哪里错了?

【问题讨论】:

标签: swift macos cocoa


【解决方案1】:

你需要在windows属性中设置acceptsMouseMovedEvents。

将以下代码添加到 applicationDidFinishLaunching

func applicationDidFinishLaunching(aNotification: NSNotification) {
    window.acceptsMouseMovedEvents = true
}

【讨论】:

    【解决方案2】:

    无需在窗口上设置任何东西。

    跟踪区域是处理此问题的正确方法。

    只需在 VC 的 viewWDidLoad() 方法中添加即可。

    let ta = NSTrackingArea(rect: CGRect.zero, options: [.activeAlways, .inVisibleRect, .mouseMoved], owner: self, userInfo: nil)
    self.view.addTrackingArea(ta)
    

    【讨论】:

      【解决方案3】:

      这是我需要在视图中跟踪鼠标移动时添加的代码。 它比以前的答案更长,但这是正确完成所需要的:)

      class MyView: NSView {
          
          var trackingArea: NSTrackingArea?
      
          // MARK: - Tracking area management
      
          /// Will install tracking area on the view if a window is set
          override func viewDidMoveToSuperview() {
              super.viewDidMoveToSuperview()
              installTrackingArea()
          }
          
          /// Install tracking area if window is set, remove previous one if needed.
          func installTrackingArea() {
              guard let window = window else { return }
              window.acceptsMouseMovedEvents = true
              if trackingArea != nil { removeTrackingArea(trackingArea!) }
              let trackingOptions = [.activeAlways, .mouseEnteredAndExited, .mouseMoved]
              trackingArea = NSTrackingArea(rect: bounds, 
                                            options: trackingOptions, 
                                            owner: self, userInfo: nil)
              self.addTrackingArea(trackingArea!)
          }
          
          /// Called when layout is modified
          override func updateTrackingAreas() {
              super.updateTrackingAreas()
              installTrackingArea()
          }
      
          //MARK: - Mouse Events handling
      
          override func mouseExited(with event: NSEvent) {
              print("Good bye mouse")
          }
          
          override func mouseEntered(with event: NSEvent) {
              let point = self.convert(event.locationInWindow, from: nil)
              print("Hello mouse, welcome at \(point)")
          }
      
          override func mouseMoved(with event: NSEvent) {
              let point = self.convert(event.locationInWindow, from: nil)
              print("Mouse moved \(point)")
          }
      }
      

      【讨论】:

        【解决方案4】:
        【解决方案5】:

        在 swift 3 中你可以把它放在你的 viewDidLoad() 中

        self.view!.window?.acceptsMouseMovedEvents = true;

        【讨论】:

          猜你喜欢
          • 2017-02-06
          • 2013-03-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-08
          • 2016-09-30
          • 2017-12-17
          相关资源
          最近更新 更多