iOS 辅助功能隐藏 "textField, double tap to edit" 公告

iOS Accessibility hide the "textField, double tap to edit" announcement

我有一个带有 pickerView 作为 inputView 的 textField。

现在,当我打开画外音和 select 文本字段时,画外音将显示为:"Quantity: 3 (content of the textField)",然后是 "textField",然后是 "Double tap to edit"。

有没有办法让画外音只读内容而跳过下面的"textField. Double tap to edit"?

我试过给 textField 另一个 UIAccessibilityTraits/Hints 但它们不起作用。

谢谢!

假设您的文本字段是 UITextField 的子类,您正在寻找静态文本特征。

UITextField* aTextField = .....
aTextField.accessibilityTraits |= UIAccessibilityTraitStaticText;

在Swift

let textField = UITextField()
textField.accessibilityTraits = UIAccessibilityTraitStaticText

*此答案中的示例代码是在 Swift 3.

中编写和测试的

关于 accessibilityTraits 属性

accessibilityTraits 属性 是 UInt64 bitmask. UIKit includes named UInt64 constants 例如 UIAccessibilityTraitStaticText 以便于记住哪些位代表哪些设置。

创建 UITextField 时,其 accessibilityTraits 属性 设置为“262144”,即二进制形式的“1000000000000000000”。这意味着右起第 19 位表示 "text field"。此设置没有常量。我试过但无法弄清楚如何将第 19 位设置为零。此位似乎受到 UITextField 实现的保护,无法编辑。您可以子类化 UITextField 并覆盖 accessibilityTraits 属性 以像这样完全控制它...

覆盖可访问性特征

private var _accessibilityTraits: UInt64 = 0
override var accessibilityTraits: UInt64 {
    get {
        return _accessibilityTraits
    }

    set {
        _accessibilityTraits = newValue
    }
}

使用 UIAccessibilityTraitStaticText

如果 "text field" 标志打开或为“1”,则 VoiceOver 将播报 "text field"。正如@ChrisCM 发布的那样,如果 "static text" 标志也打开,它会取消 "Text Field" 标志,并且 VoiceOver 不会宣布任何控件类型。

"static text" 标志是通过将二进制“1000000”的二进制“1000000”按位或与 accessibilityTraits 属性 添加十进制“64”来设置的。 UIAccessibilityTraitStaticText 常量使该值易于记忆。

这段代码说明了正在发生的事情:

UIAccessibilityTraitStaticText 详细添加到 accessibilityTraits

let textField = UITextField()
print("original textField.accessibilityTraits, binary: \(String(textField.accessibilityTraits, radix: 2)), decimal: \(textField.accessibilityTraits)")

print("UIAccessibilityTraitStaticText, binary: \(String(UIAccessibilityTraitStaticText, radix: 2)), decimal: \(UIAccessibilityTraitStaticText)")
textField.accessibilityTraits = UIAccessibilityTraitStaticText

print("modified textField.accessibilityTraits, binary: \(String(textField.accessibilityTraits, radix: 2)), decimal: \(textField.accessibilityTraits)")

控制台输出:

original textField.accessibilityTraits, binary: 1000000000000000000, decimal: 262144
UIAccessibilityTraitStaticText, binary: 1000000, decimal: 64
modified textField.accessibilityTraits, binary: 1000000000001000000, decimal: 262208

|= 运算符

以下也适用。 |= 运算符采用现有值并与“1000000”进行按位或运算。由于 UITextField accessibilityTraits 的原始值受到保护,因此没有必要。

textField.accessibilityTraits |= UIAccessibilityTraitStaticText

分配不同的特征

要分配不同的特征,例如 "button",按位或 UIAccessibilityTraitButton,如下所示:

textField.accessibilityTraits = UIAccessibilityTraitStaticText | UIAccessibilityTraitButton

print("modified textField.accessibilityTraits, binary: \(String(textField.accessibilityTraits, radix: 2)), decimal: \(textField.accessibilityTraits)")

控制台输出:

modified textField.accessibilityTraits, binary: 1000000000001000001, decimal: 262209

在这种情况下 UIAccessibilityTraitStaticText 取消 "text field" 而 UIAccessibilityTraitButton 添加 "button"