簡體   English   中英

如何限制 LongPressGesture-began 和 LongPressGesture-ended 之間的進程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM