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

MKAnnotationView custom callout is invisible to Accessibility (VoiceOver)

我有一个 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)"

UIButton

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

但这些元素中的 none 对 VoiceOver 可见。 Accessibility Inspector 看不到他们。

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

编辑 --------

我创建了一个小示例项目,其中有一个自定义标注视图,但无法获得任何辅助功能。

Example project

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


在 YouTube 上

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

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

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

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