iOS VoiceOver如何修改NSAttributedString中链接的播报内容
问题根因
你当前将UITextView的isAccessibilityElement设为YES,会让整个文本框被系统识别为单个无障碍元素,只会整体处理朗读逻辑,无法单独识别内部富文本的链接属性,所以你给整个textView设置的accessibilityAttributedHint/accessibilityAttributedLabel都没法作用到单个链接上。
解决方案
根据你的交互需求二选一即可:
方案1:支持VoiceOver单独选中每个链接交互
如果需要用户可以单独滑动选中每个链接、触发跳转,按以下步骤修改:
- 调整UITextView基础配置:
// 移除原来的这两行配置 // textView.accessibilityTraits = UIAccessibilityTraitStaticText; // textView.isAccessibilityElement = YES; // 替换为如下配置 textView.isAccessibilityElement = NO; textView.selectable = YES; // 必须开启可选中,内部链接才能被VoiceOver单独识别 textView.editable = NO;
- 给每个链接富文本添加自定义无障碍提示属性:
NSAttributedString *link_1 = [[NSAttributedString alloc] initWithString:@"some_string_1" attributes:@{ NSLinkAttributeName : some_url_1, // 新增自定义提示属性,iOS 11+支持 NSAccessibilityHintAttributeName : @"link that opens in a webpage" }]; // link_2按同样规则添加NSAccessibilityHintAttributeName属性即可
如果有大量链接需要统一配置,你也可以遍历mainText的所有属性,批量给所有带NSLinkAttributeName的range加对应的hint,不需要逐个手动添加。
方案2:仅整体朗读文本,不需要单独选中链接
如果不需要用户单独和链接交互,只需要整体朗读时替换链接的提示后缀,直接手动构造自定义的无障碍朗读内容即可:
// 手动拼接你需要的完整朗读内容,直接赋值给无障碍标签 textView.accessibilityAttributedLabel = [[NSAttributedString alloc] initWithString:@"This is our hotel some_string_1 link that opens in a webpage and these are reviews some_string_2 link that opens in a webpage"]; textView.accessibilityTraits = UIAccessibilityTraitStaticText; textView.isAccessibilityElement = YES;
系统会优先读取你自定义的accessibilityAttributedLabel内容,不会再自动识别富文本的链接追加默认提示。
内容的提问来源于stack exchange,提问作者Robinhood
相关产品推荐
相关产品推荐

