2014-09-28 45 views
4

我試圖創建SKSpriteNode的子類,它可以檢測用戶交互(點擊,雙擊和按住),然後按照委託。這在我看來似乎是一種相對普遍的需求,但是:Swift SKSpriteNode:檢測Tap/DoubleTap/LongPress

  1. 該代碼無法檢測到雙擊而不觸發單擊。
  2. 我還沒有找到一種方法來檢測持有/長按操作。

我對這一切都錯了嗎?我不禁覺得SpriteKit應該有一些標準來處理如此基本的東西。我知道有UIGestureRecognizer,但它似乎與特定的SKNodes而不是UIViews兼容。

這是我目前的。根據來自蘋果的例子,我都在主類文件的非設備特定代碼:

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) 
      } 
     } 
    } 
} 
+0

通常當我需要有檢測我用的是SKNode,它工作得更好,用戶點擊一個對象,我用了很多的問題, SKSpriteNode爲此。對於iOS特定的代碼,我將它添加到類本身,這也更好。 – Totka 2014-09-29 15:48:14

+0

感謝Totka的回覆,但是你會不會在SKNode中面臨同樣的問題?你如何檢測雙擊和長時間而不是單擊?我擔心的是,也許我的代碼遠沒有確定這種基本用戶輸入的最佳做法。 – TheNeil 2014-09-29 15:50:33

+0

我建議你使用內置的UIGestureRecognizers,因爲它們支持長時間按壓和雙擊(單抽頭抑制)。 – 0x141E 2014-10-01 08:05:28

回答

3

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

1 - 添加一個局部變量命名alreadyTouch並將其設置爲false當類初始化

2 - 內touchesBegin如果alreadyTouchfalse它設置爲true別人做什麼,你必須

3 - 設置一個0.2秒的本地Timer並添加這個到,如果別人來檢測觸摸是否足夠迅速或不。所以啓動這個計時器,你在那裏設置alreadyTouch = true

希望它可以幫助

+0

嗨托特卡,請你可以把一些示例行代碼,如你將如何運行本地計時器? – Efren 2017-10-20 06:49:43

+0

你好,我很抱歉,但我已經失去了那個項目,或者更好,與該項目的高清 – Totka 2017-10-21 15:03:08

3

您可以簡單地使用touch.tapCounttouchesBegan: