【问题标题】:Getting Mouse Coordinates in Swift在 Swift 中获取鼠标坐标
【发布时间】:2015-11-03 01:36:03
【问题描述】:

这里是 Swift 新手。

我在完成一项本应是微不足道的任务时遇到了麻烦。我想要做的就是得到鼠标光标的 x,y 坐标on-demand。我希望 not 等待鼠标移动事件触发,然后才能获取指针的坐标。

不胜感激!

【问题讨论】:

    标签: macos swift


    【解决方案1】:

    你应该看看NSEvent方法mouseLocation

    编辑/更新:Xcode 11 • Swift 5.1

    如果您想在您的应用程序处于活动状态时监视任何窗口上的事件,您可以添加一个与 mouseMoved 掩码匹配的 LocalMonitorForEvents,如果它不活动,则添加一个 GlobalMonitorForEvents。请注意,您需要将窗口属性 acceptsMouseMovedEvents 设置为 true

    import Cocoa
    
    class ViewController: NSViewController {
        lazy var window: NSWindow = self.view.window!
        var mouseLocation: NSPoint { NSEvent.mouseLocation }
        var location: NSPoint { window.mouseLocationOutsideOfEventStream }
        override func viewDidLoad() {
            super.viewDidLoad()
            NSEvent.addLocalMonitorForEvents(matching: [.mouseMoved]) {
                print("mouseLocation:", String(format: "%.1f, %.1f", self.mouseLocation.x, self.mouseLocation.y))
                print("windowLocation:", String(format: "%.1f, %.1f", self.location.x, self.location.y))
                return $0
            }
            NSEvent.addGlobalMonitorForEvents(matching: [.mouseMoved]) { _ in
                print(String(format: "%.0f, %.0f", self.mouseLocation.x, self.mouseLocation.y))
            }
        }
        override func viewWillAppear() {
            super.viewWillAppear()
            window.acceptsMouseMovedEvents = true
        }
    }
    

    Sample project

    【讨论】:

    • 感谢您的出色回答。完美运行。 NSEvent 是一座金矿。 :)
    • 很好的解决方案@Leo!但是,如果mouseLocation 的位置在我的自定义窗口之外,我不知道如何接收它。我想实现某种颜色选择器,并想在光标之外绘制一个自定义视图。如果你能带领我走向正确的方向,那就太好了!
    • @ixany 抱歉耽搁了我刚刚看到你的问题。您可以使用NSEvent.addLocalMonitorForEvents(matching: .mouseMoved) { print(NSEvent.mouseLocation()) return $0 } 如果您想在您的应用不活动时对其进行监控,只需使用全局而不是本地
    • 很好的答案,如果我只想在 NSView 中跟踪鼠标,该怎么做? (我也是 Mac 开发的新手..)
    • @Nils 您可以使用惰性关键字将窗口属性添加到视图控制器,如下所示lazy var window: NSWindow = self.view.window!,然后访问 NSWindow 属性 mouseLocationOutsideOfEventStream window.mouseLocationOutsideOfEventStream。检查上次编辑如何监视鼠标位置及其在窗口中的位置。
    【解决方案2】:

    可以通过这种方式获取当前鼠标位置:

    • 在你的视图控制器类中声明这个:

      var mouseLocation: NSPoint? { self.view.window?.mouseLocationOutsideOfEventStream }
      
    • 然后,您可以获取当前鼠标位置并转换为您想要的视图坐标:

      if let currentMouseLocation = self.mouseLocation{
      
           let pointInTargetView = self.**targetView**.convert(currentMouseLocation, from: self.view)
      
      }
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-03
      • 1970-01-01
      • 2015-12-26
      • 1970-01-01
      • 2010-09-09
      • 2018-01-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多