【问题标题】:How to correctly use UIResponder.pressesBegan to detect multi-key input如何正确使用 UIResponder.pressesBegan 检测多键输入
【发布时间】:2021-02-16 06:42:29
【问题描述】:

我正在开发一个 iOS 13+ 项目,其中包含一个可用作计算器的视图。用于输入数字和运算符 (+ - * / ...) 的数字块是使用简单的UIButtons 构建的。当前值显示在UILabel 中。

现在我想扩展现有代码以接受来自连接的硬件键盘的输入。我已经扩展了UILabel 来处理UIResponder 方法pressesBegan:withEvent

override func pressesBegan(_ presses: Set<UIPress>, with event: UIPressesEvent?) {
    guard let key = presses.first?.key else { return }

    switch key.keyCode {
    case .keyboard1:
    case .keypad1:
        insertNumber(1)
    case .keyboard2:
    case .keypad2:
        insertNumber(2)

    ...        

    case .keypadPlus:
        add()

    ...

    default:
        super.pressesBegan(presses, with: event)
    }
}

这在使用带有数字块的键盘时可以正常工作。但是,我也想支持没有数字块的键盘。在这种情况下,例如 * 符号只能使用两个键 Shift + 输入(在具有德语布局的键盘上)。

但是,当键入 Shift + 时,presses:with: 方法会被调用两次。一次用于Shift 键,一次用于+ 键。我不确定为什么单独处理每个击键时按下是Set

那么,如何检测多键组合?

【问题讨论】:

    标签: ios swift keyboard


    【解决方案1】:

    您可以检查 key.modifierFlags 属性。 类型是:

    public struct UIKeyModifierFlags : OptionSet
    

    你需要的标志是.shift。 您可以将 modifierFlags 与单个值或数组文字进行比较:

    if key.modifierFlags == .shift {
     // position of these two flags doesn't matter
    }
    

    注意#1:

    您应该找出映射到德语键盘“+”的键码(UIKeyboardHIDUsage),我从某些来源发现它是 .keyboardCloseBracket (48 或 0x30)。如果错了,告诉我,我会改正的。 此外,您可以检查从 key.characters 发送的真实字符(作为字符串类型)

    这里有一些原型代码:

    override func pressesBegan(_ presses: Set<UIPress>, with event: UIPressesEvent?) {
        guard let key = presses.first?.key else { return }
        switch key.keyCode {
        ... (many keyCode cases omitted)
        case .keyboardCloseBracket: // See NOTE#1
            if key.modifierFlags == .shift {
                // yout want "shift + " as "*"
            } else {
                // not the state for plus you want, pass it
                super.pressesBegan(presses, with: event)
            }
        ... 
        default:
            super.pressesBegan(presses, with: event)
        }
    }
    
    

    注意#2:

    .modifierFlags 无需区分左移和右移 -- 它们仅在 .keyCode

    中有所不同

    【讨论】:

      猜你喜欢
      • 2012-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-16
      • 1970-01-01
      • 1970-01-01
      • 2019-09-16
      • 1970-01-01
      相关资源
      最近更新 更多