ios - 高分辨率设备上的 UIPanGestureRecognizer 点

标签 ios uigesturerecognizer

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

在最近的 iOS 设备上,这种方法运行良好,但我们注意到在 iPhone X 等分辨率更高的设备上,显示比例为 3 倍,并且刷新速度非常快,手势不再像应有的那样流畅是。

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

与早期版本的 iOS 相比,我很肯定这些点有时会以准确的分数值形式报告以确保精度。这似乎不再是这种情况了。

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

最佳答案

一定有其他事情发生了。在运行 iOS 11.2.5 的 iPhone X 上,我从平移手势识别器接收小数坐标(正如您所期望的那样以 1/3 为增量)。

话虽如此,你可以考虑使用touchesBegantouchesMoved等,然后使用coalesced touches ,它可以提供更高频率的触摸信息(在我的 iPhone X 上,合并触摸每秒返回 120 次触摸,而不是平移手势识别器每秒返回 60 次触摸)。

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`
    }
}

但在担心之前,请提供一个简单、独立的 MCVE这体现了你描述的问题。确保问题确实出在手势识别器上,而不是例如导致您尝试在每次触摸时执行的操作变得复杂的延迟。

顺便说一句,联合触摸有助于解决接收触摸不够频繁的问题。如果你有卡顿问题,可以考虑predictive touches可以用来减少这种影响。

关于ios - 高分辨率设备上的 UIPanGestureRecognizer 点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48678039/

相关文章:

ios - 修改UITableView首次显示后的样式

ios - 自定义 UITableViewCell 数据在滚动时重复

ios - 您可以将 UIGestureRecognizer 附加到多个 View 吗?

ios7 - 我可以 'flush' UIGestureRecognizer 事件吗?

ios - 我怎样才能检测到滑动,而不是从边缘滑动?

ios - 向 tableView header 添加手势识别器不起作用?

ios - NSTimer 启动后如何更改显示的时间格式?

iphone - 执行FetchRequest :error: returns autoreleased array or with retain count = 1

ios - 如何编译 Saurik 的 Veency?

ios - -[id<UIGestureRecognizerDelegate> gestureRecognizer :shouldRecognizeSimultaneouslyWithGestureRecognizer] both recognizers are nil in debugger