关于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即可

posted @   CleverPeng  阅读(51)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示