Swift: удерживать указатель мыши в покое - PullRequest
0 голосов
/ 15 мая 2018

У меня есть приложение Mac SpriteKit / swift (игра), в котором мне нужно держать курсор внутри окна. или хотя бы предупредите, когда выйдете из окна игры.

Я уже настроил зону отслеживания и использую мышь для перемещения игрового манипулятора. Но когда курсор выходит за пределы окна, весло перестает работать.

 let options = [ .mouseMoved,
                .activeAlways,
                .mouseEnteredAndExited] as NSTrackingArea.Options
let tracker = NSTrackingArea(rect:frame, options: options, owner:view, userInfo: nil)
view.addTrackingArea(tracker)

Кажется, что сработавшие функции мыши не работают

override func mouseExited(with event: NSEvent) {
   // NSCursor.unhide()
    print("_____________________EXIT")
   //Never fires

  }

  override func mouseEntered(with event: NSEvent) {
 //   NSCursor.hide()
    print("_____________________ENTER")
 // never fires

  }

Есть идеи? Спасибо

Ответы [ 2 ]

0 голосов
/ 27 мая 2019

Я думаю, что вы были бы счастливы с другим решением: спрятать курсор и отключить движение мыши от позиции курсора.

Вы можете скрыть и показать указатель, используя CGDisplayHideCursor и CGDisplayShowCursor.

Вы можете отключить движение мыши от позиции курсора (и повторно подключить его), используя CGAssociateMouseAndMouseCursorPosition. Когда вы получаете события mouseMoved и mouseDragged, когда мышь отключена от курсора, вы можете прочитать движение мыши из полей deltaX и deltaY событий.

0 голосов
/ 27 мая 2019

Если вы хотите держать мышь в окне, вы можете использовать CGWarpMouseCursorPosition.Он устанавливает положение курсора мыши на экране.

Вот пример, чтобы держать мышь в центре вида:

NSEvent.addLocalMonitorForEvents(matching: .mouseMoved) { (event) -> NSEvent? in

    let point = NSPoint(x: self.view.frame.width * 0.5, y: self.view.frame.height * 0.5)
    let pointInWindow = self.view.convert(point, to: nil)
    if let pointOnScreen = self.view.window?.convertPoint(toScreen: pointInWindow) {
        let cgPoint = CGPoint(x: pointOnScreen.x, y: pointOnScreen.y)
        CGWarpMouseCursorPosition(cgPoint)
    }               

    return event
}

Примечание: используйте NSEvent.addLocalMonitorForEvents, чтобы получить .mouseMoved события вместо NSTrackingArea.

...