无法通过“通过” UIView的UIView

问题描述

我有一种情况是在地图视图上显示透明的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根本无法工作。 MapView无法通过VO访问。我无法通过VO选择任何mapView元素。 我进行了一些研究,发现VO使用私有方法

[UIViewAccessibility(SafeCategory) _accessibilityHitTest:withEvent:]

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

解决方法

您可以通过设置view.isAccessibilityElement = NO;来使VoiceOver忽略视图。

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