VoiceOver开启时如何从UITapGestureRecognizer获取正确的屏幕坐标

时间:2019-04-25 16:10:54

标签: ios objective-c accessibility voiceover

我目前正在使用一个交互式视图,该视图在很大程度上取决于用户的触摸位置。我发现有几种方法可以在UITapGestureRecognizer打开时与VoiceOver进行交互,但是当我轻按我的观点时,给出的值是非常错误的。我已经看过其他地方了,但是我的用例不在规范范围内,所以没有太多可以告诉我发生了什么事。有谁之前经历过这个吗?

我知道我可以将accessibilityTrait更改为UIAccessibilityTraitAllowsDirectInteraction,这将在使用时为我提供正确的屏幕显示,但是我至少想知道是什么原因导致了此问题知识。要与UITapGestureRecognizer进行交互,我可以双击或通过在屏幕上用力按压来进行3D触摸。阶梯方法不适用于轻击手势,但适用于平移手势。

这是我用来获取屏幕显示点的唯一一行。我的地图视图是UIImageView

CGPoint screenPoint = [tapGesture locationInView:map];

我正在使用建筑物的地图,并尝试点击相同的角或地标进行测试。我知道我每次都无法击中相同的精确点,但是我确实使用了手写笔,所以我可以很接近。

如果没有VoiceOver,我将得到结果:(35.500,154.363)

在启用VoiceOver并点击大致相同的位置时,我会得到(187.500,197.682)

我要测试的点在屏幕的左侧,而VoiceOver启用的结果在屏幕的中间。我相信y轴值可能由于我的工具栏的大小而发生了变化,但是我不知道x轴值有什么问题。如果需要更多信息,请告诉我。

更新:经过进一步调查,结果显示UITapGestureRecognizer将始终返回(187.500,197.682),无论我在VoiceOver启用时在地图视图中的何处触摸。该点似乎在地图视图的中间。不过奇怪的是,如果在VoiceOver开启时使用3D触摸,UIPanGestureRecognizer将为我提供正确的视图(x,y)。

在与当前问题无关的旁注中,似乎如果我使用可访问性特征UIAccessibilityTraitAllowsDirectInteraction,则方法UIAccessibilityConvertFrameToScreenCoordinates返回的帧会比我的视图高。如果我不改变特质,效果很好。

1 个答案:

答案 0 :(得分:0)

您的问题可能与 VoiceOver 启用时使用的参考点有关。 验证点坐标所指的是:视图坐标还是屏幕坐标?

我建议您看一下以下元素:

根据您的项目,前面的元素可能很有趣,可以达到您的目的。