如何为 UITextField 中的占位符文本设置可访问性特征?
Posted
技术标签:
【中文标题】如何为 UITextField 中的占位符文本设置可访问性特征?【英文标题】:How can I set an accessibility trait for the placeholder text in UITextField? 【发布时间】:2012-04-12 19:39:52 【问题描述】:我正在检查我们的 ios 应用程序来解决辅助功能问题。该应用程序的功能之一是用户可以在其中输入搜索查询的 UITextField。我已将该字段的特征设置为“搜索字段”,并且 VoiceOver 大部分时间都可以很好地处理该字段。当字段中有文本时,它会读取文本,然后说“搜索字段”。
我要解决的问题是 VoiceOver 如何处理占位符文本。当文本字段为空时,我们已设置占位符文本以显示示例查询。由于它显示为灰色文本,有视力的用户可以看到它只是占位符文本。但 VoiceOver 并没有为视障用户做出这种区分。它只是像普通文本一样读取占位符文本,没有额外的描述。
有没有办法向 UITextField 的占位符文本添加可访问性特征?或者人们是否通过其他方式解决了这个问题?
【问题讨论】:
【参考方案1】:从 UITextField 派生一个自定义类,如下所示(代码在 Swift 中,但您可以适应 Objective-C):
class MyTextField: UITextField
override public var accessibilityValue: String?
get return self.text
set super.accessibilityValue = newValue
将此类用作自定义类而不是 UITextField。当该字段为空时,这将阻止 VoiceOver 读取占位符文本。
然后将您的可访问性标签设置为例如“搜索”和可访问性提示到您想要提示的任何内容(请参阅 Apple 的 Guidelines for Creating Hints)。您可以通过编程方式分配这些值,但最好在 Interface Builder 中分配它们。
【讨论】:
getter 方法永远不会被调用,但是 setter 会被调用。有什么想法吗?【参考方案2】:我相信您可以在 NSString 对象上设置 accessibilityLabel 和其他可访问性属性,然后将该字符串用作占位符文本。 Voiceover 将发现该属性并使用它。
NSString *placeholderText = @"Search";
placeholderText.accessibilityLabel = @"Try searching for xxxx";
field.placeholder = placeholderText;
类似的东西。未经测试,但我在其中一个 WWDC 开发者视频中看到了它。
警告:iOS 8.0 及更高版本中的行为与预期不同。
//In iOS 8+
NSString *placeholderText = @"Search"; //This will be announced
placeholderText.accessibilityLabel = @"Try searching for xxxx";//This will be ignored
field.placeholder = placeholderText;
这个答案应该被认为是过时的。
【讨论】:
这毫无意义。特征仅适用于 UI 对象。 这是引用分段控件和可访问性标签而不是特征。请查看这个开源存储库,了解为什么您的解决方案实际上是无意义的,以及为什么特征在 NSString 对象上不起作用,即使它们应用于分段控件。分段控件恰好是 NSStrings 上的可访问性标签的例外,尽管我没有对此发表评论。但是,在我的演示中,您将看到此异常不适用于占位符文本,正如 OP 所要求的那样。 github.com/chriscm2006/iOS-Traits-on-NSStrings OP 询问“或者人们是否通过其他方式解决了这个问题?”因此我的建议。另见adcdownload.apple.com/wwdc_2012/wwdc_2012_session_pdfs/… 他们也使用表视图索引标题上的标签。那是从 2012 年开始,当时我写了原始答案。除了任何对象都可以使用 UIAccessibility 之外,您还可以将任何东西设为可访问性元素。 是的,您可以为 nsstrings 和其他对象实现协议,但正如我的演示清楚地指出的那样,可以(并且)忽略该信息。许多有效代码的东西都不起作用。如果此行为在 ios 6/7 中有效,但现在不是,因此您的解决方法无效。 不用担心。也许留下遗留答案是合理的,只要人们知道 ios 8 中的代码不能像您的帖子中暗示的那样工作。当我不在移动设备上时,我可能会发布相应的编辑:)【参考方案3】:你不能。特征仅对可访问性元素有意义。让您的 UITextField 成为“静态文本”可能不正确。在文本字段中的项目上设置特征将无效,即使它可能是有效代码。
你可以做的是编辑控件的accessibilityLabel。
【讨论】:
以上是关于如何为 UITextField 中的占位符文本设置可访问性特征?的主要内容,如果未能解决你的问题,请参考以下文章
将占位符添加到 UITextField,如何以编程方式快速设置占位符文本?