簡體   English   中英

如何在屏幕上跟蹤手指的時間 swift

[英]How to track time of finger on screen swift

我在這里是因為經過數周嘗試不同的解決方案並且沒有提供正確的答案和功能性的應用程序后,我已經筋疲力盡了。 我需要跟蹤手指在屏幕上的時間,如果手指在屏幕上的時間超過 1 秒,我需要調用 function。 但是,如果現在用戶正在執行平移或捏合等手勢,則不得調用 function。

 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    super.touchesBegan(touches, with: event)
    
    let touch = touches.first
    guard let touchLocation = touch?.location(in: self) else {return }
    let tile: Tile?
    switch atPoint(touchLocation){
    case let targetNode as Tile:
        tile = targetNode
    case let targetNode as SKLabelNode:
        tile = targetNode.parent as? Tile
    case let targetNode as SKSpriteNode:
        tile = targetNode.parent as? Tile
    default:
        return
    }
    
    guard let tile = tile else {return }
   
    paint(tile: tile)

}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    super.touchesEnded(touches, with: event)
    
}
private func paint(tile: Tile){
    let col =  tile.column
    let row = tile.row
    let colorPixel =  gridAT(column: col, row: row)
    
    if !tile.isTouchable {
        
    }else {
        
        if !selectedColor.isEmpty {
            
            if tile.mainColor == selectedColor {
                
                tile.background.alpha = 1
                tile.background.color = UIColor(hexString:selectedColor)
                tile.text.text = ""
                tile.backgroundStroke.color = UIColor(hexString:selectedColor)
                uniqueColorsCount[selectedColor]?.currentNumber += 1
                didPaintCorrect(uniqueColorsCount[selectedColor]?.progress ?? 0)
                colorPixel?.currentState = .filledCorrectly
                tile.isTouchable = false
            }
            else if tile.mainColor != selectedColor {
                tile.background.color = UIColor(hexString:selectedColor)
                tile.background.alpha = 0.5
                colorPixel?.currentState = .filledIncorrectly
            }
        }
    }
}

這是我為您創建的一個小示例,建議您使用UILongPressGestureRecognizer ,因為它似乎比處理touchesBegintouchesEnded更容易管理您的情況

您可以給它用戶需要點擊的最短時間,因此它看起來非常適合您的要求。

你可以在這里閱讀更多關於它的信息

首先,我使用以下代碼在我的 UIViewController 中設置了一個基本的 UIView 並添加了一個長按手勢識別器:

    override func viewDidLoad() {
        super.viewDidLoad()
        
        // Create a basic UIView
        longTapView = UIView(frame: CGRect(x: 15, y: 30, width: 300, height: 300))
        longTapView.backgroundColor = .blue
        view.addSubview(longTapView)
        
        // Initialize UILongPressGestureRecognizer
        let longTapGestureRecognizer = UILongPressGestureRecognizer(target: self,
                                                                    action: #selector(self.handleLongTap(_:)))
        
        // Configure gesture recognizer to trigger action after 2 seconds
        longTapGestureRecognizer.minimumPressDuration = 2
        
        // Add gesture recognizer to the view created above
        view.addGestureRecognizer(longTapGestureRecognizer)
    }

這給了我這樣的東西:

帶有 UILongPressGestureRecognizer 的 UIView

接下來,要獲得點擊的位置,要問自己的主要問題是 - 用戶點擊了哪些視圖?

例如,假設用戶點擊這里:

UITapGestureRecognizer UIView

現在我們可以詢問水龍頭的位置與

  1. 藍色 UIView - 大約 x = 0,y = 0
  2. ViewController - 大約 x = 15, y = 30
  3. UIView - 大約 x = 15,y = 120

UITapGesture 位置點擊 UITouch

因此,根據您的應用程序,您需要決定您希望觸摸哪個視圖。

因此,您可以根據視圖獲得觸摸:

    @objc
    private func handleLongTap(_ sender: UITapGestureRecognizer)
    {
        let tapLocationInLongTapView = sender.location(in: longTapView)
        let tapLocationInViewController = sender.location(in: view)
        let tapLocationInWindow = sender.location(in: view.window)
        
        print("Tap point in blue view: \(tapLocationInLongTapView)")
        print("Tap point in view controller: \(tapLocationInViewController)")
        print("Tap point in window: \(tapLocationInWindow)")
        
        // do your work and function here
    }

對於與上圖相同的觸摸,我得到以下 output 打印出來:

Tap point in blue view: (6.5, 4.5)
Tap point in view controller: (21.5, 34.5)
Tap point in window: (21.5, 98.5)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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