我在用Swift编程的iOS应用程序中使用UIPanGestureRecognizer
,让用户控制图像的颜色分量。虽然更新只需要非常小的一秒,但整体外观却很差,因为UIPanGestureRecognizer
被称为每秒几十次。确保这不会发生的最佳方法是什么?现在我只是让它只是每三次更新就调用一次函数,但这似乎并不理想。UIPanGestureRecognizer更新间隔
1
A
回答
1
我相信你的解决方案(只考虑每第三次更新)是基于一个错误的假设,如果你不能足够快地回应手势,他们会积压。但这不是它的工作原理。如果主线程无法跟上手势,它会放弃手势,不会积压。事实上,您的解决方案(考虑每三次更新一次)只会引入延迟而不是解决问题。
因此,我们的目标是让触感更加灵敏。这里有两种可能的问题:
潘手势需要一点点运动之前它成功地确定为泛,从而可以有短暂的延迟最初识别手势之前。
虽然有各地的手势识别此之前问题的技巧,还有第二个功能,可能当你不使用手势识别和实施
touchesBegan
,touchesMoved
等,来代替。您不仅可以避免先识别姿势的滞后,还可以参与预测性触摸。
因此,在设备上具有高性能触摸,你可以这样做:
var start: CGPoint?
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
start = touches.first?.location(in: view)
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
guard let touch = touches.first else { return }
let point: CGPoint
if let predictedTouch = event?.predictedTouches(for: touch)?.last {
point = predictedTouch.location(in: view)
} else {
point = touch.location(in: view)
}
updateColor(for: point)
}
// make sure when you're done to update in `touchesEnded`, too, in case
// the last `touchesMoved` generated a predictive touch, but when we're
// done, we really want to use the final real `location`
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
guard let touch = touches.first else { return }
updateColor(for: touch.location(in: view))
}
private func updateColor(for point: CGPoint) {
// do something with `start` and `point` to adjust the color
}
注意,根据我的经验,你不会总是在模拟器中体验触摸预测,所以一定要确保在物理设备上进行测试。
值得认识到还有第三个潜在的问题。具体来说,如果您的“更改颜色分量”花费太长的时间来呈现一致的60 fps,那么您会希望在仪器中进行一些时间分析以确定问题的根源。但是如果没有看到您的问题的可重复的例子(即MCVE),我们不能发表评论。
此外,请确保您执行“发布”版本(取决于您的Swift代码,它可以进行相当显着的性能更改),并在物理设备上进行测试,因为设备中的图形性能与其非常不同在模拟器中。
但是,如果您使用预测触摸并测试物理设备上的发布版本,则通常应该获得不错的性能。但是很难说没有看到一些代码。
相关问题
- 1. RadScheduler更新间隔
- 2. Android位置更新间隔
- 3. requestLocationUpdates中的更新间隔
- 4. 更新间隔的图形
- 5. UIView块动画更新时间间隔
- 6. IOS-位置更新时间间隔
- 7. RSS Feader更新时间间隔
- 8. 如何更新基于时间间隔
- 9. kubernetes滚动更新时间间隔
- 10. 更新时间间隔的Firebase条目
- 11. 以短间隔或长时间间隔长间隔请求位置更新是否更好?
- 12. 在Angular中间隔更新字段
- 13. 根据另一列+间隔更新列
- 14. 如何在间隔后更新GUI
- 15. requestLocationUpdates不会更新间隔Android
- 16. 更新多个infowindow与间隔
- 17. AngularJS ScopeLive更新并设置间隔
- 18. Android:AppWidgetProvider不能更改更新间隔时间
- 19. 更新间隔小于1秒的速度每秒更新
- 20. 刷新时间间隔
- 21. 每隔固定的时间间隔更新会话属性。 Java,Servlets,JSP
- 22. 更改缓存中的更新间隔以更新GPS - Windows Phone 7.5
- 23. Knockout.js和Twitterfeed更新页面的时间间隔
- 24. 位置服务的更新时间间隔Android
- 25. RxSwift,MVVM,Alamofire/Moya。使用时间间隔更新报价器
- 26. 在一定的时间间隔后更新反应状态
- 27. 在iphone中使用常规时间间隔更新tableview
- 28. 如何更新部分间隔时间的cshtml共享布局?
- 29. 以一定的时间间隔从XML提要更新页面
- 30. 如何使角度2更新后的时间间隔观察?
你可以发送平移手势操纵UIColor的代码吗? –