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

Dar*_*ren 5 accessibility mapkit mkmapview ios voiceover

我有一个MKAnnotationView子类并将其中的几个放在MKMapView. 该MKAnnotationView子类设置一些辅助元素是这样的:

func applyAccessibility() {
    
    self.isAccessibilityElement = true
    self.accessibilityTraits = [.none]
    
    self.accessibilityLabel = "Bus stop map pin"
    self.accessibilityValue = busStop.name
}
Run Code Online (Sandbox Code Playgroud)

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

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

init标注视图中,我设置了:

isAccessibilityElement = true
accessibilityTraits = .none
accessibilityLabel = "Callout view"
accessibilityIdentifier = "BusStopAnnotationCalloutView.callout"
Run Code Online (Sandbox Code Playgroud)

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

label.isAccessibilityElement = true
label.accessibilityTraits = .header
label.accessibilityLabel = "\(busStop.name)"
Run Code Online (Sandbox Code Playgroud)

用户界面按钮

button.isAccessibilityElement = true
button.accessibilityTraits = .button
button.accessibilityLabel = "Select this bus stop"
Run Code Online (Sandbox Code Playgroud)

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

当我在视图中移动时,Accessibility Inspector它会拾取并且MKAnnotation位于标注下方的地图上。

编辑 - - - -

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

示例项目

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

视频缩略图
在YouTube上

小智 4

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