Swift newbie here.
I've been having trouble with a task that should be trivial. All I want to do is get the x,y coordinates of the mouse cursor on-demand. I would prefer not to wait for a mouse movement event to fire before I can grab the pointer's coords.
Would appreciate any help!
You should take a look at NSEvent method mouseLocation
edit/update: Xcode 11 • Swift 5.1
If you would like to monitor events on any window when your app is active, you can add a LocalMonitorForEvents matching mouseMoved mask and if it is not active a GlobalMonitorForEvents. Note that you need set to your window property acceptsMouseMovedEvents
to 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
You can get the current mouse location in this way:
Declare this in your view controller class:
var mouseLocation: NSPoint? { self.view.window?.mouseLocationOutsideOfEventStream }
Then, you can get the current mouse location and convert in your desired view coordinates:
if let currentMouseLocation = self.mouseLocation{ let pointInTargetView = self.**targetView**.convert(currentMouseLocation, from: self.view) }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With