ios - VoiceOver 开启时如何从 UITapGestureRecognizer 获取正确的屏幕坐标
问题描述
我目前正在研究一个严重依赖用户触摸位置的交互式视图。我发现有几种方法可以与UITapGestureRecognizer
while进行交互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
无论我在 VoiceOver 打开时在地图视图中触摸的哪个位置,都会返回(187.500、197.682)。该点似乎是地图视图的中间。奇怪的是,UIPanGestureRecognizer
如果我在 VoiceOver 开启时使用 3D 触摸,它将为我的视图提供正确的 (x,y)。
在与手头的问题无关的旁注中,如果我使用可访问性特征UIAccessibilityTraitAllowsDirectInteraction
,该方法似乎会UIAccessibilityConvertFrameToScreenCoordinates
返回一个高于我的视图的框架。如果我不改变特征,它工作正常。
解决方案
您的问题可能与VoiceOver开启时使用的参考点有关。验证您的点坐标指的是:视图坐标还是屏幕坐标?
我建议你看看以下元素:
根据您的项目,前面的元素可能对达到您的目的很有趣。
推荐阅读
- javascript - 运行 grunt 任务时出现 grunt 语法错误问题
- freeradius - Chilli 不会断开与 freeradius 的客户端会话
- sql - 如何编写sql查询来检查房间可用性
- visual-studio-code - 卸载了我能找到的所有东西,但扩展主机仍然意外终止
- xslt - 将 XSLT 中的变量字符串与 IF 条件进行比较
- python - 在 Python 中的 2 列上合并两个不同大小的数据框
- android - Android - 在片段上按下后退按钮只会重新打开相同的片段
- schema - 最好为事件发生的每个日期编写一个 JSON-LD 脚本,还是在一个脚本中定义所有日期?
- android - Android CardView 没有上边框
- python - Django 无法识别模块导入/应用文件夹