Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Getting Mouse Coordinates in Swift

Tags:

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!

like image 271
MattY Avatar asked Aug 11 '15 00:08

MattY


2 Answers

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

like image 154
Leo Dabus Avatar answered Sep 20 '22 03:09

Leo Dabus


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)  } 
like image 37
M Afham Avatar answered Sep 22 '22 03:09

M Afham