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
。
编辑 --------
我创建了一个小示例项目,其中有一个自定义标注视图,但无法获得任何辅助功能。
还有一段显示问题的简短屏幕录像:
在直接向 Apple 提出 Developer Technical Support
请求后,他们认为这是一个错误,但是由于这不适用于我测试过的 iOS 的任何版本,我建议这与其说是错误,不如说是疏忽,我很惊讶没有其他人想让地图视图标注可访问。
Apple DTS 还询问我是否希望他们寻找解决方法,几天后他们回来说根本没有!
所以现在,从 iOS 12.4 开始,这里的答案是这是不可能的。
这里的问题是您的标注视图是注释视图的子视图。
因此,如果您的注释视图将 isAccessibilityElement
设置为 true,则您无法专注于标注。
解决此问题的一种方法是在每次选择注释时将注释的 isAccessibilityElement
设置为 false,反之亦然。
我有一个 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
。
编辑 --------
我创建了一个小示例项目,其中有一个自定义标注视图,但无法获得任何辅助功能。
还有一段显示问题的简短屏幕录像:
在直接向 Apple 提出 Developer Technical Support
请求后,他们认为这是一个错误,但是由于这不适用于我测试过的 iOS 的任何版本,我建议这与其说是错误,不如说是疏忽,我很惊讶没有其他人想让地图视图标注可访问。
Apple DTS 还询问我是否希望他们寻找解决方法,几天后他们回来说根本没有!
所以现在,从 iOS 12.4 开始,这里的答案是这是不可能的。
这里的问题是您的标注视图是注释视图的子视图。
因此,如果您的注释视图将 isAccessibilityElement
设置为 true,则您无法专注于标注。
解决此问题的一种方法是在每次选择注释时将注释的 isAccessibilityElement
设置为 false,反之亦然。