如何在 VoiceOver 打开时从 UITapGestureRecognizer 获取正确的屏幕坐标
How to get correct screen coordinate from UITapGestureRecognizer while VoiceOver is on
我目前正在开发一个很大程度上依赖于用户触摸位置的交互式视图。我发现有几种方法可以在 VoiceOver
打开时与 UITapGestureRecognizer
交互,但是当我点击我的观点时,给出的值是非常错误的。我看过其他地方,但我的用例超出了标准,所以没有太多信息可以告诉我发生了什么。有谁之前经历过这个吗?
我知道我可以将 accessibilityTrait
更改为 UIAccessibilityTraitAllowsDirectInteraction
,这将在使用时为我提供正确的屏幕点,但我想至少知道是什么导致了这个问题为了知识。要与 UITapGestureRecognizer
交互,我要么双击,要么通过在屏幕上用力按压来进行 3D 触摸。阶梯方法不适用于点击手势,但适用于平移手势。
这是我用来获取屏幕点数的唯一一行。我的地图视图是 UIImageView
CGPoint screenPoint = [tapGesture locationInView:map];
我正在使用建筑物的地图,并尝试点击相同的角落或地标进行测试。我知道我不能每次都击中相同的精确点,但我确实使用手写笔并且我可以非常接近。
如果没有打开 VoiceOver,我会得到结果:(35.500, 154.363)
打开 VoiceOver 并敲击大致相同的位置,我得到:(187.500, 197.682)
我用来测试的点在屏幕的左侧,VoiceOver打开的结果在屏幕中间。我相信 y 轴值可能会因为我的工具栏的大小而改变,但我不知道是什么导致了 x 轴值的变化。如果需要更多信息,请告诉我。
更新:经过进一步调查,事实证明 UITapGestureRecognizer
将始终 return (187.500, 197.682),无论我在 VoiceOver 打开时触摸地图视图中的哪个位置。那一点似乎是地图视图的中间。奇怪的是,如果我在 VoiceOver 打开时使用 3D 触摸,UIPanGestureRecognizer
会为我的视图提供正确的 (x,y)。
在与手头问题无关的旁注中,似乎如果我使用可访问性特征 UIAccessibilityTraitAllowsDirectInteraction
方法 UIAccessibilityConvertFrameToScreenCoordinates
return 是一个比我的观点更高的框架.如果我不改变特征,它就可以正常工作。
您的问题可能与 VoiceOver 开启时使用的参考点有关。
验证您的点坐标指的是什么:视图坐标还是屏幕坐标?
我建议您看一下以下要素:
- accessibilityFrame
- accessibilityFrameInContainerSpace
- UIAccessibilityConvertFrameToScreenCoordinates
根据您的项目,前面的元素可能对您的目的很有趣。
我目前正在开发一个很大程度上依赖于用户触摸位置的交互式视图。我发现有几种方法可以在 VoiceOver
打开时与 UITapGestureRecognizer
交互,但是当我点击我的观点时,给出的值是非常错误的。我看过其他地方,但我的用例超出了标准,所以没有太多信息可以告诉我发生了什么。有谁之前经历过这个吗?
我知道我可以将 accessibilityTrait
更改为 UIAccessibilityTraitAllowsDirectInteraction
,这将在使用时为我提供正确的屏幕点,但我想至少知道是什么导致了这个问题为了知识。要与 UITapGestureRecognizer
交互,我要么双击,要么通过在屏幕上用力按压来进行 3D 触摸。阶梯方法不适用于点击手势,但适用于平移手势。
这是我用来获取屏幕点数的唯一一行。我的地图视图是 UIImageView
CGPoint screenPoint = [tapGesture locationInView:map];
我正在使用建筑物的地图,并尝试点击相同的角落或地标进行测试。我知道我不能每次都击中相同的精确点,但我确实使用手写笔并且我可以非常接近。
如果没有打开 VoiceOver,我会得到结果:(35.500, 154.363)
打开 VoiceOver 并敲击大致相同的位置,我得到:(187.500, 197.682)
我用来测试的点在屏幕的左侧,VoiceOver打开的结果在屏幕中间。我相信 y 轴值可能会因为我的工具栏的大小而改变,但我不知道是什么导致了 x 轴值的变化。如果需要更多信息,请告诉我。
更新:经过进一步调查,事实证明 UITapGestureRecognizer
将始终 return (187.500, 197.682),无论我在 VoiceOver 打开时触摸地图视图中的哪个位置。那一点似乎是地图视图的中间。奇怪的是,如果我在 VoiceOver 打开时使用 3D 触摸,UIPanGestureRecognizer
会为我的视图提供正确的 (x,y)。
在与手头问题无关的旁注中,似乎如果我使用可访问性特征 UIAccessibilityTraitAllowsDirectInteraction
方法 UIAccessibilityConvertFrameToScreenCoordinates
return 是一个比我的观点更高的框架.如果我不改变特征,它就可以正常工作。
您的问题可能与 VoiceOver 开启时使用的参考点有关。 验证您的点坐标指的是什么:视图坐标还是屏幕坐标?
我建议您看一下以下要素:
- accessibilityFrame
- accessibilityFrameInContainerSpace
- UIAccessibilityConvertFrameToScreenCoordinates
根据您的项目,前面的元素可能对您的目的很有趣。