UIPanGestureRecognizer指向高分辨率设备

时间:2018-02-08 05:14:29

标签: ios uigesturerecognizer

在iOS应用的几个地方,我们使用手势识别器以交互方式关闭视图。这个过程非常简单,我们跟踪用户手指的移动,并用它移动视图。

在最近的iOS设备上,这个功能相当不错,但是我们注意到iPhone X等分辨率较高的设备,其显示尺寸为3倍,刷新速度非常快,手势不再那么平滑是

我认为这是因为UIGestureRecognizer类正在返回-locationInView:的整点值,所以当交互很慢时,我们实际上一次将视图移动3个像素,这在高质量的显示器上是显而易见的。

我比早期版本的iOS更积极,这些点有时会以精确的精确分数值报告。这似乎不再是这种情况了。

有没有人对如何改善这种行为有任何建议?

2 个答案:

答案 0 :(得分:1)

必须有其他事情发生。在运行iOS 11.2.5的iPhone X上,我从平移手势识别器接收小数坐标(以你期望的1/3为增量)。

话虽如此,您可以考虑使用touchesMovedoverride func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { guard let touch = touches.first else { return } if let coalesced = event?.coalescedTouches(for: touch), coalesced.count > 0 { // process all of the `coalesced` touches } else { // just process `touch` } } 等,然后使用coalesced touches,它可以提供更高频率的触摸信息(在我的iPhone X上) ,合并触摸每秒返回120次触摸,而不是平移手势识别器每秒60次触摸。)

{{1}}

但在担心之前,请提供一个简单,独立的MCVE来表明您描述的问题。确保问题确实是手势识别器,而不是例如延迟导致您在每次触摸时尝试执行的操作的复杂性。

顺便说一句,合并的触摸有助于解决不经常接触的问题。如果你有一个懒散的问题,你可以考虑使用predictive touches来减少这种影响。

答案 1 :(得分:0)

这是一个奇怪的。感谢Rob的信息和声称他正在接收小数坐标,我开始挖掘更多。

事实证明,当我们使用UIGestureRecognizer子类(仅允许在一个特定方向上进行平移)时,问题就很明显了。

子类“-(void)touchesMoved:...”中收到的坐标确实是小数。不知何故,在识别器的动作回调中使用-(CGPoint)locationInView:仅报告整个值。除了存储-(void)touchesMoved...中收到的最新值并在动作回调中读取它之外,我无法以任何方式解决此异常问题。

也感谢Rob提供了关于合并触摸的建议,这是我将来想要研究的内容。