簡體   English   中英

Swift SKSpriteNode:檢測Tap / DoubleTap / LongPress

[英]Swift SKSpriteNode: Detect Tap / DoubleTap / LongPress

我正在嘗試創建SKSpriteNode的子類,它可以檢測用戶交互(點按,雙擊並按住),然后按照委托。 在我看來,這似乎是一個相對普遍的需求,但是:

  1. 該代碼無法在不觸發單擊的情況下檢測到雙擊。
  2. 我還沒有找到一種檢測保持/長按動作的方法。

我錯了嗎? 我不禁覺得SpriteKit應該有一些標准來處理這么基本的東西。 我知道有UIGestureRecognizer,但它似乎與特定的SKNode而不是UIViews非常兼容。

這就是我目前所擁有的。 基於Apple的示例,我在主類文件中包含了所有非設備特定的代碼:

import SpriteKit

enum ActionType: Int {
    case Single
    case Double
    case Hold
}

protocol EnvironmentElementDelegate {
    func handleActionOnElement(element: EnvironmentElement, actionType: ActionType)
}

class EnvironmentElement: SKSpriteNode {

    let delegate: EnvironmentElementDelegate!

    init(imageNamed: String, elementNamed: String, delegate: EnvironmentElementDelegate) {
        self.delegate = delegate
        let texture = SKTexture(imageNamed: imageNamed)
        super.init(texture: texture, color: UIColor.clearColor(), size: texture.size())
        self.name = elementNamed
        userInteractionEnabled = true
    }

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
}

...然后將所有特定於iOS的代碼放在單獨的擴展文件中:

import SpriteKit

extension EnvironmentElement {

    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        for touch: AnyObject in touches {
            if (touch.tapCount >= 2) {
                NSObject.cancelPreviousPerformRequestsWithTarget(self)
            }
        }
    }

    override func touchesEnded(touches: NSSet, withEvent event: UIEvent) {
        for touch: AnyObject in touches {
            if (touch.tapCount == 1) {
                delegate.handleActionOnElement(self, actionType: ActionType.Single)
                // Unable to find Swift equivalent to this: [self performSelector:@selector(onFlip) withObject:nil afterDelay:0.3];
            } else {
                delegate.handleActionOnElement(self, actionType: ActionType.Double)
            }
        }
    }
}

我從來沒有檢測到雙擊,但如果我有,我將這樣做:

1 - 添加一個名為alreadyTouch的本地var,並在初始化類時將其設置為false

2 - 如果alreadyTouchfalse則在內部touchesBegin alreadyTouch其設置為true否則執行您必須執行的操作

3 - 設置0.2秒的本地Timer並將其添加到if else以檢測觸摸是否足夠快。 所以啟動此計時器,你設置alreadyTouch = true

希望能幫助到你

你可以在touchesBegan:使用touch.tapCount touchesBegan:

暫無
暫無

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

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