[英]How to limit a process between LongPressGesture-began and LongPressGesture-ended
要求很簡單:當用戶觸摸屏幕並按住手指時,我想啟動一個活動(例如在屏幕上繪制圓圈)。 當手指再次抬起時,該活動將立即停止。 所以我使用了UILongPressGestureRecognizer
。 這會產生一個.began 和.ended 事件。 但是問題是當一個activity基於the.began事件啟動時,只要activity正在進行,the.ended事件就不會發生。 我對 .ended 事件的意圖是它將停止已啟動的活動。 以這種方式,活動執行將被限制在手指觸摸和抬起之間的時間。
我將示例代碼增強為甚至 2 個獨立UILongPressGestureRecognizers
,它們可以使用UIGestureRecognizerDelegate
構造同時工作。 兩個識別器的同時 function 工作。 然而,當其中一個啟動活動時,第二個識別器也不會接收事件,直到活動結束。
這個微不足道的要求如何實現?
這是我的示例代碼。 該活動被簡化為 10 個打印語句。 每秒 1 個。 當觸摸手指在 2 秒后抬起時,循環將繼續剩余 8 秒。
import UIKit
class ViewController: UIViewController {
var fingerDown = false
@IBOutlet var MyLongPress1: UILongPressGestureRecognizer!
@IBOutlet var MyLongPress2: UILongPressGestureRecognizer!
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func handleLongPress1(_ gesture: UILongPressGestureRecognizer) {
if (gesture as AnyObject).state == .began {
print("longPress1 began")
fingerDown = true
myActivity()
} else if (gesture as AnyObject).state == .ended {
print("longPress1 ended")
fingerDown = false
}
}
@IBAction func handleLongPress2(_ gesture: UILongPressGestureRecognizer) {
if (gesture as AnyObject).state == .began {
print("longPress2 began")
fingerDown = true
} else if (gesture as AnyObject).state == .ended {
print("longPress2 ended")
fingerDown = false
}
}
func myActivity() {
var count = 0
while fingerDown && count < 10 {
sleep(1)
count += 1
print("in myActivity \(count)")
}
}
}
extension ViewController: UIGestureRecognizerDelegate {
func gestureRecognizer(
_ gestureRecognizer: UIGestureRecognizer,
shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer
) -> Bool {
return true
}
}
任何好的建議將不勝感激!
您正在 function 中執行同步代碼。
相反,您應該做的是創建一個異步的、可取消的操作,該操作在.began
事件上開始,並在.ended
事件上取消它。 這方面的代碼太復雜了,無法編寫並在這里給出答案。 相反,您可以參考像這樣的並發/異步代碼教程來正確實現您正在嘗試做的事情。
一個更簡單但仍然有效的解決方案是簡單地異步調用您的 function ,因此它不會阻塞主線程:
DispatchQueue.global().async {
self.myActivity()
}
在您的代碼中進行這樣的異步調用是可以的,但是代碼中還有其他問題使得它不是很干凈。 例如,您的代碼依賴於額外的fingerDown
state 而不是實際的 state 手勢; 使用sleep
等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.