You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS VoiceOver如何修改NSAttributedString中链接的播报内容

问题根因

你当前将UITextView的isAccessibilityElement设为YES,会让整个文本框被系统识别为单个无障碍元素,只会整体处理朗读逻辑,无法单独识别内部富文本的链接属性,所以你给整个textView设置的accessibilityAttributedHint/accessibilityAttributedLabel都没法作用到单个链接上。

解决方案

根据你的交互需求二选一即可:

方案1:支持VoiceOver单独选中每个链接交互

如果需要用户可以单独滑动选中每个链接、触发跳转,按以下步骤修改:

  1. 调整UITextView基础配置:
// 移除原来的这两行配置
// textView.accessibilityTraits = UIAccessibilityTraitStaticText;
// textView.isAccessibilityElement = YES;
// 替换为如下配置
textView.isAccessibilityElement = NO;
textView.selectable = YES; // 必须开启可选中,内部链接才能被VoiceOver单独识别
textView.editable = NO;
  1. 给每个链接富文本添加自定义无障碍提示属性:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 00:15:10