我在用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. 更新間隔/部分查看間隔
- 3. 更新間隔位置
- 4. 更新間隔的圖形
- 5. 睡眠但間隔更新
- 6. Android位置更新間隔
- 7. iOS CoreMotion Gryoscope更新間隔
- 8. 間隔更新JavaFX 2 GUI?
- 9. requestLocationUpdates中的更新間隔
- 10. kubernetes滾動更新時間間隔
- 11. UIView塊動畫更新時間間隔
- 12. IOS-位置更新時間間隔
- 13. RSS Feader更新時間間隔
- 14. 更新時間間隔的Firebase條目
- 15. jQuery按時間間隔更新圖像
- 16. 用時間間隔更新對象
- 17. 如何更新基於時間間隔
- 18. 以短間隔或長時間間隔長間隔請求位置更新是否更好?
- 19. 根據另一列+間隔更新列
- 20. 如何在間隔後更新GUI
- 21. requestLocationUpdates不會更新間隔Android
- 22. 更新多個infowindow與間隔
- 23. 以特定間隔更新html表格
- 24. 如何更新列間隔vlaue?
- 25. 在間隔後更新HTML標記
- 26. 更新行的間隔小時
- 27. 在Angular中間隔更新字段
- 28. 間隔後從api更新數字
- 29. AngularJS ScopeLive更新並設置間隔
- 30. 如何更改/更新NSTimer中的時間間隔?
你可以發送平移手勢操縱UIColor的代碼嗎? –