2017-02-02 8 views
0

私は自分のUIGestureRecognizerサブクラスを構築して、タップとスワイプのジェスチャを組み合わせ、スワイプの動きの方向を追跡します。この意図されたジェスチャーでは、ユーザーは画面に触れ、指を画面に戻してドラッグする前に、指が画面から1回以上完全に跳ね返るようにします。それはすぐにスワイプが続くタップです。カスタムUIGestureRecognizerでの位置のトラッキング

私はこの認識装置の実際のジェスチャー部分を正しく動作させることができましたが、私が問題を見つけているのは、ユーザーのスワイプが移動した点の軌跡を保存することです。

まず、私は私のカスタム認識クラスのクラスメンバーとしてCGPointの配列を初期化

class UITapSwipeGestureRecognizer: UIGestureRecognizer { 
    ... 
    var trail: [CGPoint] = [] 

その後、空でない場合touchesBegan(_, with)に、私が最初の配列をクリアし、への出発点を養います配列

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) { 
    ... 
    if !trail.isEmpty { // EXC_BAD_ACCESS error thrown here 
     trail.removeAll(keepingCapacity: true) 
    } 
    trail.append(location(in: view?.window)) 
    ... 
} 

私はtouchesMoved(_, with)に私の使用状況を議論するために行くだろうが、これは私の問題を引き起こすのに十分です。 !trail.isEmptyで、アレイにアクセスする最初の試みの際に、私は次のエラーを取得する:
Thread 1 EXC_BAD_ACCESS (code=1, address=0x10)

私はこの配列のスレッドセーフバージョンを作成する必要がありますか?もしそうなら、私はこれをどうやって行うべきですか?あるいは、私はこれだけ完全に間違った方法をとっていますか?

+0

からアクセスする方法を説明しますエラーが発生している場所で機能を表示してください。また、コードのどの行がエラーを生成しているのですか?空のチェック、削除、追加...? – Russell

+0

関数の宣言を含めて、ブロックにもう少しコードを追加しました。このエラーは 'trail'への最初の呼び出しで投げられます。特に'!trail.isEmpty'呼び出しではそうです。 – theodinspire

+0

まあ、それは起こるべきではありません!その行にブレークポイントを設定した場合 'if!trail.isEmpty' - ' trail'はどのように見えますか?あなたは[CGPoint]の0値配列として正しく定義されているはずです。 – Russell

答えて

0

StoryBoardを通じてジェスチャー認識機能を追加することで、エラーを再現することができました。

プログラムで追加すると、エラーは発生しません。 、あなたはすべてのものを含める必要はありません -

は、ここでジェスチャ認識装置クラス

import UIKit 
import UIKit.UIGestureRecognizerSubclass 

class MyGestureClass: UIGestureRecognizer 
{ 
    var trail: [CGPoint] = [] 

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) { 
     super.touchesBegan(touches, with: event) 
     state = .began 

     if !trail.isEmpty { 
      trail.removeAll(keepingCapacity: true) 
     } 
     trail.append(location(in: view?.window)) 
     print(trail.count) // Just for debugging 
    }  

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent) { 
     super.touchesMoved(touches, with: event) 
     trail.append(location(in: view?.window)) 
     print(trail.count) // Just for debugging 
    } 

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent) { 
     super.touchesEnded(touches , with: event) 
     state = .ended 
     print("Finished \(trail.count)") // Just for debugging 
    } 
} 

だとここで私は私たちに、コードのより完全なブロックを示しビューコントローラ

override func viewDidLoad() 
{ 
    super.viewDidLoad() 

    let myRecognizer = MyGestureClass(target: self, action: #selector(self.tap(_:))) 
    self.view.addGestureRecognizer(myRecognizer) 
} 

func tap(_ sender: UITapGestureRecognizer) 
{ 
    // No need to do anything here, but appears to be required 
} 
+0

ありがとうございます。私は私のプロジェクトでこれを前進させて使用します。 私はそれを世界と共有するために@IBDesignableとしてまとめられることを望んでいましたが、それが可能な限りatmの外にあれば – theodinspire

関連する問題