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
相关产品推荐
相关产品推荐

