[英]Swift SKSpriteNode: Detect Tap / DoubleTap / LongPress
我正在嘗試創建SKSpriteNode的子類,它可以檢測用戶交互(點按,雙擊並按住),然后按照委托。 在我看來,這似乎是一個相對普遍的需求,但是:
我錯了嗎? 我不禁覺得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 - 如果alreadyTouch
為false
則在內部touchesBegin
alreadyTouch
其設置為true
否則執行您必須執行的操作
3 - 設置0.2秒的本地Timer
並將其添加到if else以檢測觸摸是否足夠快。 所以啟動此計時器,你設置alreadyTouch = true
。
希望能幫助到你
你可以在touchesBegan:
使用touch.tapCount
touchesBegan:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.