如何在 Mac Catalyst 应用程序中收听按键操作?
How do I listen to key presses in a Mac Catalyst app?
我有一个简单的 iOS 游戏,我正在移植到 Mac。我希望用户能够使用键盘控制游戏。没有原生文本输入(如 UITextField
、UITextView
)。
如何在 Mac Catalyst 应用程序中监听按键事件?这看起来并不微不足道。
UIKeyCommand
不起作用,因为它似乎是为组合而制作的(例如 cmd+c
)。我可以创建一个假文本字段,但我正在寻找一种更简洁的方法来执行此操作。我想听单个字母和数字。
我能以某种方式整合 NSResponder::keyDown(with:)
吗?
您可以重写 pressesBegan 方法。这是我在游戏中用来控制玩家的示例代码。它使用 UIKeyCommand 作为特殊命令键,例如箭头键,并使用 key.character 来对特殊字符做出反应。
原代码来自Apple Catalyst Documentation。
override func pressesBegan(_ presses: Set<UIPress>, with event: UIPressesEvent?) {
var didHandleEvent = false
for press in presses {
guard let key = press.key else { continue }
if key.charactersIgnoringModifiers == UIKeyCommand.inputLeftArrow || key.characters == "a" {
self.moveLeft(self)
didHandleEvent = true
} else if key.charactersIgnoringModifiers == UIKeyCommand.inputRightArrow || key.characters == "d" {
self.moveRight(self)
didHandleEvent = true
} else if key.charactersIgnoringModifiers == UIKeyCommand.inputUpArrow || key.characters == "w" {
self.moveForward(self)
didHandleEvent = true
} else if key.charactersIgnoringModifiers == UIKeyCommand.inputDownArrow || key.characters == "s" {
self.moveBackward(self)
didHandleEvent = true
} else if key.characters == "q" {
self.turnLeft(self)
didHandleEvent = true
} else if key.characters == "e" {
self.turnRight(self)
didHandleEvent = true
}
}
if didHandleEvent == false {
// Didn't handle this key press, so pass the event to the next responder.
super.pressesBegan(presses, with: event)
}
}
我有一个简单的 iOS 游戏,我正在移植到 Mac。我希望用户能够使用键盘控制游戏。没有原生文本输入(如 UITextField
、UITextView
)。
如何在 Mac Catalyst 应用程序中监听按键事件?这看起来并不微不足道。
UIKeyCommand
不起作用,因为它似乎是为组合而制作的(例如 cmd+c
)。我可以创建一个假文本字段,但我正在寻找一种更简洁的方法来执行此操作。我想听单个字母和数字。
我能以某种方式整合 NSResponder::keyDown(with:)
吗?
您可以重写 pressesBegan 方法。这是我在游戏中用来控制玩家的示例代码。它使用 UIKeyCommand 作为特殊命令键,例如箭头键,并使用 key.character 来对特殊字符做出反应。 原代码来自Apple Catalyst Documentation。
override func pressesBegan(_ presses: Set<UIPress>, with event: UIPressesEvent?) {
var didHandleEvent = false
for press in presses {
guard let key = press.key else { continue }
if key.charactersIgnoringModifiers == UIKeyCommand.inputLeftArrow || key.characters == "a" {
self.moveLeft(self)
didHandleEvent = true
} else if key.charactersIgnoringModifiers == UIKeyCommand.inputRightArrow || key.characters == "d" {
self.moveRight(self)
didHandleEvent = true
} else if key.charactersIgnoringModifiers == UIKeyCommand.inputUpArrow || key.characters == "w" {
self.moveForward(self)
didHandleEvent = true
} else if key.charactersIgnoringModifiers == UIKeyCommand.inputDownArrow || key.characters == "s" {
self.moveBackward(self)
didHandleEvent = true
} else if key.characters == "q" {
self.turnLeft(self)
didHandleEvent = true
} else if key.characters == "e" {
self.turnRight(self)
didHandleEvent = true
}
}
if didHandleEvent == false {
// Didn't handle this key press, so pass the event to the next responder.
super.pressesBegan(presses, with: event)
}
}