在iOS应用的几个地方,我们使用手势识别器以交互方式关闭视图。这个过程非常简单,我们跟踪用户手指的移动,并用它移动视图。
在最近的iOS设备上,这个功能相当不错,但是我们注意到iPhone X等分辨率较高的设备,其显示尺寸为3倍,刷新速度非常快,手势不再那么平滑是
我认为这是因为UIGestureRecognizer
类正在返回-locationInView:
的整点值,所以当交互很慢时,我们实际上一次将视图移动3个像素,这在高质量的显示器上是显而易见的。
我比早期版本的iOS更积极,这些点有时会以精确的精确分数值报告。这似乎不再是这种情况了。
有没有人对如何改善这种行为有任何建议?
答案 0 :(得分:1)
必须有其他事情发生。在运行iOS 11.2.5的iPhone X上,我从平移手势识别器接收小数坐标(以你期望的1/3为增量)。
话虽如此,您可以考虑使用touchesMoved
,override 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提供了关于合并触摸的建议,这是我将来想要研究的内容。