MKAnnotationView 自定义标注对辅助功能 (VoiceOver) 不可见

Posted

技术标签:

【中文标题】MKAnnotationView 自定义标注对辅助功能 (VoiceOver) 不可见【英文标题】:MKAnnotationView custom callout is invisible to Accessibility (VoiceOver) 【发布时间】:2021-05-15 12:33:50 【问题描述】:

我有一个MKAnnotationView 子类,并将其中几个放在MKMapView 上。 MKAnnotationView 子类设置了一些可访问性元素,如下所示:

func applyAccessibility() 
    
    self.isAccessibilityElement = true
    self.accessibilityTraits = [.none]
    
    self.accessibilityLabel = "Bus stop map pin"
    self.accessibilityValue = busStop.name

VoiceOver 会读出固定在地图上的巴士站的名称。

然后我使用UIView 子类作为公共汽车站被点击时的标注视图。

func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) 
    
    if let annotation = view.annotation
    
        if annotation is MKUserLocation
        
            // This is our location marker
            return
        
        
        busStopAnnotationCalloutView.setupForAnnotationView(view, delegate: self)
        
        view.addSubview(busStopAnnotationCalloutView)
        
        mapView.setCenter(annotation.coordinate, animated: true)
    

这很好用,但是这个标注视图对 VoiceOver 完全不可见。

在我设置的标注视图的init中:

isAccessibilityElement = true
accessibilityTraits = .none
accessibilityLabel = "Callout view"
accessibilityIdentifier = "BusStopAnnotationCalloutView.callout"

它还创建了自己的标签和一个按钮,我设置的类似如下:

label.isAccessibilityElement = true
label.accessibilityTraits = .header
label.accessibilityLabel = "\(busStop.name)"

UI按钮

button.isAccessibilityElement = true
button.accessibilityTraits = .button
button.accessibilityLabel = "Select this bus stop"

但这些元素对 VoiceOver 都不可见。 Accessibility Inspector 看不到它们。

当我使用Accessibility Inspector 在视图中移动时,它只会拾取地图上标注下方的MKAnnotation

编辑--------

我创建了一个小型示例项目,该项目具有自定义标注视图,但无法获得任何可访问性。

Example project

还有一个简短的屏幕录像显示问题:

on YouTube

【问题讨论】:

我无法下载您的示例,但我可以在我的项目中重现该问题。您是否尝试使用UIAccessibilityContainer? ***.com/questions/26538359/…(还在我的待办事项清单上,抱歉) 不,这个问题并不能真正解释它,但我会对此进行一些研究。 【参考方案1】:

这里的问题是您的标注视图是注释视图的子视图。 因此,如果您的注释视图将 isAccessibilityElement 设置为 true,则您不能专注于标注。 解决此问题的一种方法是在每次选择注释时将注释的 isAccessibilityElement 设置为 false,反之亦然。

【讨论】:

哇!你是对的。甚至 Apple 也没有通过 DTS 和 Bug Report 了解这一点。谢谢。【参考方案2】:

在直接向 Apple 提出 Developer Technical Support 请求后,他们认为这是一个错误,但是由于这不适用于我测试的任何 ios 版本,我建议这更像是一个疏忽而不是错误我很惊讶没有其他人想让地图视图标注可访问。

Apple DTS 还询问我是否希望他们寻找解决方法,几天后他们回来说根本没有!

所以现在,从 iOS 12.4 开始,这里的答案是这是不可能的。

【讨论】:

以上是关于MKAnnotationView 自定义标注对辅助功能 (VoiceOver) 不可见的主要内容,如果未能解决你的问题,请参考以下文章

自定义标注视图不想出现

自定义地图注释标注 - 如何控制宽度

如何在地图视图中添加自定义标注视图

自定义 iOS8 标注气泡 (Swift)

ios中Mkmapview中的自定义标注

如何添加在图形页面定制标注视图