UITextView设置自定义富文本后无障碍特性(Accessibility)不符合预期的问题求助
嘿,我来帮你捋捋这个问题~ 你遇到的情况其实是因为当UITextView的isSelectable设为true时,系统会自动把它识别成一个Group类型的无障碍元素——毕竟它里面包含了可选择的内容(你加的链接也属于可交互的子内容),这时候你手动设置的accessibilityTraits = .link就被系统给覆盖掉了,所以VoiceOver才会读成Group而不是你想要的Link。
给你两个针对性的解决方案,你可以根据自己的需求选:
方案一:不需要文本选择功能,只把整个TextView当单一链接元素
如果你只是想展示带链接样式的文本,不需要用户选中、复制文本的话,直接把isSelectable改成false就行。不过要注意,这时候TextView默认的链接点击会失效,所以得自己加个点击手势来处理跳转逻辑:textView.isSelectable = false // 添加点击手势处理跳转 let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTextViewTap)) textView.addGestureRecognizer(tapGesture)然后在
handleTextViewTap方法里实现原来链接的跳转逻辑就好。这样调整后,VoiceOver就会正确读取你设置的accessibilityLabel加上“Link”了。方案二:需要保留文本选择功能
如果必须允许用户选择、复制文本,那可以通过自定义UITextView子类,重写accessibilityTraits属性来强制返回.link,以此覆盖系统默认的Group特性:class CustomAccessibleTextView: UITextView { override var accessibilityTraits: UIAccessibilityTraits { get { return .link } set { // 这里可以根据需求处理新的trait,或者直接忽略即可 } } }之后用这个自定义类代替原来的UITextView,再保留你原来的无障碍设置,就能让VoiceOver正确识别成Link了。
另外还要确认下你设置的isAccessibilityElement = true和accessibilityElements = nil是生效的,这两个设置是对的,能确保整个TextView作为一个单一的无障碍元素,不会被拆分成内部的子元素。
内容来源于stack exchange

