【问题标题】:Swift: Keep mouse pointer from leaving windowSwift:防止鼠标指针离开窗口
【发布时间】:2018-10-25 16:43:16
【问题描述】:

我有一个 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

  }

有什么想法吗?谢谢

【问题讨论】:

  • 如果此代码在 GameScene.swift(或另一个 SKScene 子类)中,owner 参数应该是 self 而不是 view
  • 谢谢!!成功了。

标签: swift macos sprite-kit


【解决方案1】:

如果您想将鼠标保持在窗口中,您可以使用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

【讨论】:

    【解决方案2】:

    我认为您会更喜欢不同的解决方案:隐藏光标并断开鼠标移动与光标位置的连接。

    您可以使用CGDisplayHideCursorCGDisplayShowCursor 隐藏和显示指针。

    您可以使用CGAssociateMouseAndMouseCursorPosition 断开鼠标移动与光标位置的连接(并重新连接)。当您在鼠标与光标断开连接时收到mouseMovedmouseDragged 事件时,您可以从事件的deltaXdeltaY 字段中读取鼠标移动。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多