平移时 VoiceOver 无法访问超级视图边界之外的视图

Views outside superview bounds are inaccessible to VoiceOver when panning around

在我的应用程序中,我有一些控件是 UIView 的子视图,但它们的框架在父视图范围之外。它们对有视力的用户可见,因为 clipsToBoundsfalse。对于 VoiceOver 用户,他们可以突出显示其父视图边界内的控件,然后向右滑动以突出显示边界外的下一个控件。这按预期工作。但是,如果他们改为点击并在屏幕上平移,VoiceOver 永远不会突出显示其父视图边界之外的元素。如何确保在四处移动时可以访问这些元素?

我创建了一个遇到此问题的示例项目。这里有两个按钮作为子视图添加到灰色 UIView。按钮 0 位于其父视图的边界内,按钮 1 位于外部。平移时可以访问按钮 0,但不能访问按钮 1。

辅助功能框架似乎使用 UIView.point(inside:_, with:_) 来确定是否可以通过 VoiceOver 访问视图。

我已经解决了这个问题,方法是在父视图上重写此函数并在该点超出父视图范围但在子视图范围内时返回 true

在这种特殊情况下,我的超级视图有一个绘制在超级视图边界之外的背景视图,而我希望 VoiceOver 可以访问的视图位于该背景视图的边界内。所以我有:

override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
    return background.frame.contains(point)
}

根据您的情况进行适当调整。