Получение координат мыши в Swift

Быстрый новичок здесь.

У меня возникли проблемы с задачей, которая должна быть тривиальной. Все, что я хочу сделать, это получить координаты x, y курсора мыши по требованию. Я бы предпочел не ждать срабатывания события движения мыши, прежде чем я смогу захватить координаты указателя.

Был бы признателен за любую помощь!


person MattY    schedule 11.08.2015    source источник


Ответы (2)


Вам следует взглянуть на метод NSEvent местоположение мыши

изменить/обновить: Xcode 11 • Swift 5.1

Если вы хотите отслеживать события в любом окне, когда ваше приложение активно, вы можете добавить LocalMonitorForEvents, соответствующую маске mouseMoved, и, если она не активна, 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
    }
}

Пример проекта

person Leo Dabus    schedule 11.08.2015
comment
Спасибо за отличный ответ. Работает отлично. NSEvent — это золотая жила. :) - person MattY; 12.08.2015
comment
Отличное решение @Лео! Однако я не мог узнать, как получить mouseLocation, если его позиция находится за пределами моего пользовательского окна. Я хочу получить какую-то палитру цветов и хочу нарисовать собственный вид, кроме курсора. Было бы здорово, если бы вы могли вести меня в правильном направлении! - person ixany; 21.01.2017
comment
@ixany извините за задержку, я только что увидел ваш вопрос. Вы можете использовать NSEvent.addLocalMonitorForEvents(matching: .mouseMoved) { print(NSEvent.mouseLocation()) return $0 } Если вы хотите отслеживать его, когда ваше приложение неактивно, просто используйте глобальный вместо локального - person Leo Dabus; 22.03.2017
comment
Отличный ответ, как это сделать, если я просто хочу отслеживать мышь внутри NSView? (Я также новичок в разработке Mac..) - person Nils; 16.09.2017
comment
@Nils Вы можете добавить свойство окна в свой контроллер представления, используя ключевое слово lazy, как показано ниже lazy var window: NSWindow = self.view.window!, а затем получить доступ к свойству NSWindow mouseLocationOutsideOfEventStream window.mouseLocationOutsideOfEventStream. Проверьте последнее редактирование, как вы можете контролировать местоположение мыши и ее положение в окне. - person Leo Dabus; 10.10.2017
comment
Используйте self.view.window?.acceptsMouseMovedEvents = true В противном случае объявление глобальной window принудительной переменной вызовет цикл сохранения. - person M Afham; 28.03.2020
comment
@MAfham Я не объявлял окно глобальной переменной. Он объявлен как свойство контроллера представления. Он будет жить столько же, сколько и контроллер представления. В любом случае self.view.window?.acceptsMouseMovedEvents = true в порядке, если он не используется внутри viewDidLoad, где свойство окна равно нулю - person Leo Dabus; 20.04.2020

Вы можете получить текущее местоположение мыши следующим образом:

  • Объявите это в своем классе контроллера представления:

    var mouseLocation: NSPoint? { self.view.window?.mouseLocationOutsideOfEventStream }
    
  • Затем вы можете получить текущее местоположение мыши и преобразовать его в желаемые координаты вида:

    if let currentMouseLocation = self.mouseLocation{
    
         let pointInTargetView = self.**targetView**.convert(currentMouseLocation, from: self.view)
    
    }
    
person M Afham    schedule 28.03.2020