"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, ...];
我有一个案例,在地图视图上显示透明 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;
.
或者,您可以使 view
符合 UIAccessibilityContainer
协议。如果由于某种原因不起作用,您可以设置 view.accessibilityElements = @[mapView, ...];