iOS辅助功能隐藏"textField,双击以编辑"声明

Ke *_* MA 4 iphone accessibility uitextfield ios voiceover

我有一个textField,其中pickerView作为inputView.

现在,当我有画外音并选择textField时,画外音将读取:"数量:3(textField的内容)",然后是"textField",然后是"Double tap to edit".

无论如何都要让画外音只是阅读内容并跳过下面的"textField.双击编辑"?

我试图给textField另一个UIAccessibilityTraits/Hints,但它们不起作用.

谢谢!

Chr*_*sCM 6

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

UITextField* aTextField = .....
aTextField |= UIAccessibilityTraitStaticText;
Run Code Online (Sandbox Code Playgroud)

  • 这是完美的答案!无法相信它隐藏在UIAccessibilityTraits中.我试图将特性更改为按钮,它宣布"按钮,文本字段".还尝试将其设置为无,它仍然宣布"textfield"谢谢ChrisCM,AccessibilityMaster! (2认同)

Mob*_*Dan 6

在斯威夫特

let textField = UITextField()
textField.accessibilityTraits = UIAccessibilityTraitStaticText
Run Code Online (Sandbox Code Playgroud)

*本答案中的示例代码是在Swift 3中编写和测试的.

 

关于accessibilityTraits物业

accessibilityTraits属性是一个UInt64 位掩码.UIKit中包括命名UINT64常量UIAccessibilityTraitStaticText在记忆容易哪些位表示的设置.

创建UITextField时,其accessibilityTraits属性设置为"262144",二进制为"1000000000000000000".这意味着右边的第19位表示"文本字段".此设置没有常量.我尝试但无法弄清楚如何将第19位设置为零.该位似乎受到UITextField实现的编辑保护.您可以继承UITextField并覆盖accessibilityTraits属性以完全控制它,就像这样......

覆盖accessibilityTraits

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

    set {
        _accessibilityTraits = newValue
    }
}
Run Code Online (Sandbox Code Playgroud)

 

使用UIAccessibilityTraitStaticText

如果"文本字段"标志打开或"1",则VoiceOver将通知"文本字段".正如@ChrisCM发布的那样,如果"静态文本"标志也打开,它将取消"文本字段"标志,而VoiceOver不会宣布任何控件类型.

"静态文本"标志是通过将十进制"64"添加到accessibilityTraits属性执行二进制"1000000"的按位OR来设置的.该UIAccessibilityTraitStaticText常数使得这个数值容易记住.

此代码说明了发生的情况:

添加UIAccessibilityTraitStaticTextaccessibilityTraits详细

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)")
Run Code Online (Sandbox Code Playgroud)

控制台输出:

original textField.accessibilityTraits, binary: 1000000000000000000, decimal: 262144
UIAccessibilityTraitStaticText, binary: 1000000, decimal: 64
modified textField.accessibilityTraits, binary: 1000000000001000000, decimal: 262208
Run Code Online (Sandbox Code Playgroud)

 

|= 操作者

以下也有效.该|=运营商采用现有的值,并执行按位或为"1000000".由于UITextField accessibilityTraits受保护的原始值,这不是必需的.

textField.accessibilityTraits |= UIAccessibilityTraitStaticText
Run Code Online (Sandbox Code Playgroud)

 

分配不同的特征

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

textField.accessibilityTraits = UIAccessibilityTraitStaticText | UIAccessibilityTraitButton

print("modified textField.accessibilityTraits, binary: \(String(textField.accessibilityTraits, radix: 2)), decimal: \(textField.accessibilityTraits)")
Run Code Online (Sandbox Code Playgroud)

控制台输出:

modified textField.accessibilityTraits, binary: 1000000000001000001, decimal: 262209
Run Code Online (Sandbox Code Playgroud)

在这种情况下UIAccessibilityTraitStaticText取消"文本字段",同时UIAccessibilityTraitButton添加"按钮"