"pass through" UIView 后面的 UIView 无法通过 VO 访问

UIViews behind "pass through" UIView isn't VO accessible

我有一个案例,在地图视图上显示透明 UIViewController。 ViewController.view 是透明的,它是一个“传递”视图。这意味着 ViewController 的所有触摸都传递到 VC 后面的地图视图。

“传递”行为由

实现
override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
    for subview in subviews {
        if !subview.isHidden && subview.alpha > 0 && subview.isUserInteractionEnabled && subview.point(inside: convert(point, to: subview), with: event) {
            return true
        }
    }
    return false
}

所有的触摸和手势都完美无缺,但我发现 VoiceOver 根本不起作用。无法通过 VO 访问 MapView。我不能 select 任何带有 VO 的 mapView 元素。 我做了一些研究,发现VO使用了私有方法:

[UIViewAccessibility(SafeCategory) _accessibilityHitTest:withEvent:]

并且看起来此方法未使用重写的 pointInside 方法。那么有人知道如何以安全的方式修复它吗?

您可以通过设置 view.isAccessibilityElement = NO;.

让 VoiceOver 忽略视图

或者,您可以使 view 符合 UIAccessibilityContainer 协议。如果由于某种原因不起作用,您可以设置 view.accessibilityElements = @[mapView, ...];