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

iOS VoiceOver滑动UITextView时如何将日期读作MMMM d, yyyy格式

出现这个现象的原因是VoiceOver全局自动朗读时会自动检测文本中的日期并做语义格式化,但手动滑动选中局部文本时会直接读取文本的显示内容,不会触发自动检测格式化,所以需要手动指定对应文本片段的VoiceOver朗读内容。

解决方案

你可以通过给富文本中日期对应的范围添加专属的VoiceOver朗读属性实现需求,iOS 11及以上版本都支持该特性:

  • 第一步:提前梳理所有日期的显示值(你用到的mm/d/yyyy格式,注意如果是月份请用大写MM,小写mm对应分钟)和对应的朗读值(MMMM d, yyyy格式),同时定位每个日期在整个富文本中的NSRange
  • 第二步:给每个日期的范围添加accessibilitySpeechLabel属性,属性值为你预先格式化好的朗读用日期字符串
  • 第三步:把构造完成的富文本赋值给UITextView的attributedText即可

代码示例(Swift)

// 准备两种日期格式化器
let displayFormatter = DateFormatter()
displayFormatter.dateFormat = "MM/d/yyyy" // 显示用格式

let speakFormatter = DateFormatter()
speakFormatter.dateFormat = "MMMM d, yyyy" // 朗读用格式
speakFormatter.locale = Locale.current // 保证月份朗读符合系统当前语言

// 构造富文本
let contentStr = "完整文本内容 10/5/2024 其余文本"
let attributedContent = NSMutableAttributedString(string: contentStr)

// 定位日期在文本中的范围,此处仅为示例,实际可通过正则匹配所有日期位置
let dateRange = NSRange(location: 6, length: 9)
if let targetDate = displayFormatter.date(from: "10/5/2024") {
    let speakDateStr = speakFormatter.string(from: targetDate)
    // 给日期范围添加自定义朗读属性
    attributedContent.addAttribute(.accessibilitySpeechLabel, value: speakDateStr, range: dateRange)
}

// 赋值给UITextView
textView.attributedText = attributedContent

兼容说明

  • Objective-C环境下对应属性为NSAccessibilitySpeechLabelAttribute,使用逻辑和Swift完全一致
  • 如果需要支持iOS 11以下系统,可以额外给日期范围添加accessibilityLabel属性,属性值同样为朗读用的日期字符串

内容的提问来源于stack exchange,提问作者Krishna Chaitanya Bandaru

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 17:54:03