关于Maccatalyst键盘操作问题
开发Mac catalyst应用时, 如果有键盘操作, 就会很帅.
key
我们可以新建一个简单的空白项目, 然后重写控制器的
func pressesBegan(_ presses: Set<UIPress>, with event: UIPressesEvent?)
方法, 打印按键的基本属性, 比如
override func pressesBegan(_ presses: Set<UIPress>, with event: UIPressesEvent?) {
for press in presses {
guard let key = press.key else {
return
}
print("========= pressesBegan \(press)")
}
super.pressesBegan(presses, with: event)
}
获取按键特征
然后我们根据press.key
属性, 整理常用按键比如上下左右,WASD, back, enter等.
这里面有两种方法:
1. key.charactersIgnoringModifiers
/// @returns a string representing which characters would be inserted into a text field when this key is
/// pressed, not taking any held modifiers into account.
/// @discussion for Latin based languages, expect this to be always in lowercase (unmodified meaning not
/// taking shift key into account). If only a modifier key was pressed, this property will contain an empty string.
open var charactersIgnoringModifiers: String { get }
这个方法返回一个字符串(可以参考UIKeyCommand), 具体的可以去搜一下这个属性的更多解释. 该方法有个缺点就是不够清晰
switch key.charactersIgnoringModifiers {
case UIKeyCommand.inputDelete:
self.pressBack()
case UIKeyCommand.f2:
self.pressF2()
case UIKeyCommand.f5:
self.pressF5()
case "\u{7F}":
// 等价于 key.keyCode == UIKeyboardHIDUsage.keyboardDeleteForward
self.pressDelete()
case UIKeyCommand.inputLeftArrow:
self.pressLeft()
case UIKeyCommand.inputRightArrow:
self.pressRight()
case UIKeyCommand.inputUpArrow:
self.pressUp()
case UIKeyCommand.inputDownArrow:
self.pressDown()
default: break
}
2. key.keyCode
/// @returns the raw HID usage code for the pressed key. See UIKeyConstants.h.
open var keyCode: UIKeyboardHIDUsage { get }
这是一个枚举(具体可以查看这个枚举UIKeyboardHIDUsage
), 我们处理起来就轻松很多.
// 键盘的enter 数字键盘的enter
switch key.keyCode {
case UIKeyboardHIDUsage.keyboardReturnOrEnter: // 大键盘的enter键
fallthrough
case UIKeyboardHIDUsage.keypadEnter: // 数字键盘的enter
didHandleEvent = true
self.pressReturnOrEnter()
case UIKeyboardHIDUsage.keyboardDeleteForward: // 大键盘的delete键
fallthrough
case UIKeyboardHIDUsage.keypadPeriod: // 数字键的delete
didHandleEvent = true
self.pressDelete()
case UIKeyboardHIDUsage.keyboardDeleteOrBackspace: // 删除键, back
didHandleEvent = true
self.back()
case UIKeyboardHIDUsage.keyboardF2: // F2
didHandleEvent = true
self.pressF2()
case UIKeyboardHIDUsage.keyboardF5: // F5
didHandleEvent = true
self.pressF5()
case UIKeyboardHIDUsage.keyboardD: // D
fallthrough
case UIKeyboardHIDUsage.keypad6: // 数字小键盘6
fallthrough
case UIKeyboardHIDUsage.keyboardRightArrow: // 箭头右
// didHandleEvent = true
self.pressRight()
case UIKeyboardHIDUsage.keyboardA: // A
fallthrough
case UIKeyboardHIDUsage.keypad4: // 数字小键盘4
fallthrough
case UIKeyboardHIDUsage.keyboardLeftArrow: // 箭头左
// didHandleEvent = true
self.pressLeft()
case UIKeyboardHIDUsage.keyboardW: // W
fallthrough
case UIKeyboardHIDUsage.keypad8: // 数字小键盘8
fallthrough
case UIKeyboardHIDUsage.keyboardUpArrow: // 箭头上
didHandleEvent = true
self.pressUp()
case UIKeyboardHIDUsage.keyboardS: // S
fallthrough
case UIKeyboardHIDUsage.keypad2: // 数字小键盘2
fallthrough
case UIKeyboardHIDUsage.keyboardDownArrow: // 箭头下
didHandleEvent = true
self.pressDown()
default: break
}
仅供参考, 剩下的只需要实现自定义的pressFunc即可
iOS相关
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY