2015-07-09 8 views
1

Я создал сцену SpriteKit, ссылаясь на пользовательский NSView с использованием раскадровки в Xcode. Однако я не могу реализовать какие-либо события mouseMoved, используя SpriteKit, потому что я не знаю, как ссылаться на NSWindow программы, чтобы установить ее свойство acceptsMouseMovedEvents в значение «true».Использование acceptsMouseMovedEvents для действий мыши с помощью раскадровки и Swift

Как создать ссылку @IBOutlet на мой NSWindow в моем AppDelegate.swift файле так, что я могу изменить это свойство?

ответ

2

Вы можете настроить объект NSTrackingArea для отслеживания движения мыши, а также когда курсор входит или выходит из вида. Чтобы создать объект NSTrackingArea, вы указываете область представления, в которой вы хотите отслеживать события мыши, владелец, который получит сообщения о событиях мыши, и когда произойдет отслеживание (например, в окне ключа). Ниже приведен пример того, как добавить зону отслеживания в представление. Добавьте в свой SKScene подкласс, например GameScene.swift.

Swift 3 и 4

override func didMove(to view: SKView) { 
    // Create a tracking area object with self as the owner (i.e., the recipient of mouse-tracking messages 
    let trackingArea = NSTrackingArea(rect: view.frame, options: [.activeInKeyWindow, .mouseMoved], owner: self, userInfo: nil) 
    // Add the tracking area to the view 
    view.addTrackingArea(trackingArea) 
} 

// This method will be called when the mouse moves in the view 
override func mouseMoved(with theEvent: NSEvent) { 
    let location = theEvent.location(in: self) 
    print(location) 
} 

Swift 2

override func didMoveToView(view: SKView) { 
    // Create a tracking area object with self as the owner (i.e., the recipient of mouse-tracking messages 
    let trackingArea = NSTrackingArea(rect: view.frame, options: NSTrackingAreaOptions.ActiveInKeyWindow | NSTrackingAreaOptions.MouseMoved, owner: self, userInfo: nil) 
    // Add the tracking area to the view 
    view.addTrackingArea(trackingArea) 
} 

// This method will be called when the mouse moves in the view 
override func mouseMoved(theEvent: NSEvent) { 
    let location = theEvent.locationInNode(self) 
    println(location) 
} 
0

Обновление для ответа 0x141E в:

override func didChangeSize(_ oldSize: CGSize) { 
    guard let newRect = view?.bounds else {return} 

    let options = NSTrackingArea.Options(rawValue: NSTrackingArea.Options.activeInKeyWindow.rawValue | NSTrackingArea.Options.mouseMoved.rawValue) 
    let userInfo = ["SKMouseInput": 1] 
    let trackingArea = NSTrackingArea(rect: newRect, options: options, owner: self, userInfo: userInfo) 
    if let previousTrackingAreas = view?.trackingAreas { 
     for area in previousTrackingAreas { 
      if let theInfo = area.userInfo { 
       if let _ = theInfo["SKMouseInput"] { 
        view?.removeTrackingArea(area) 
       } 
      } 
     } 
    } 
    view?.addTrackingArea(trackingArea) 
} 

Этот метод коррекции SKScene будет называться вскоре после того, как я nitialization, позволит иммунитет к изменениям размера окна и очистит старую зону отслеживания. Обратите внимание, что для этого все равно потребуется переопределить mouseMoved.

Смежные вопросы