2017-10-30 11 views
1

いくつかのUILabelsで使用するtapGestureRecognizerを1つだけ作成しようとしています(失敗しています)。複数のUILabelsに対してtapGestureRecognizerを1つだけ作成する方法は?

今、私はviewDidLoadのすべてのラベルに対して別々のtapGestureRecognizerを作成し、それを適切なラベルに追加しています。すべてのタッチが明らかに異なる機能を呼び出す必要があるため、この問題に遭遇しました。

これは私がそれらを作成する方法である:

@IBOutlet weak var buttonOne: UILabel! 
@IBOutlet weak var buttonTwo: UILabel! 

override func viewDidLoad() { 
    super.viewDidLoad() 

     //tapGestureRecognizer for buttonOne 

     buttonOne.isUserInteractionEnabled = true 
     let oneGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(MainViewController.buttonOneAction)) 
     buttonOne.addGestureRecognizer(oneGestureRecognizer) 

     //tapGestureRecognizer for buttonTwo 

     buttonTwo.isUserInteractionEnabled = true 
     let twoGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(MainViewController.buttonTwoAction)) 
     buttonTwo.addGestureRecognizer(twoGestureRecognizer) 

     ... 

彼らは正常に動作しますが、どこでどのように私はちょうど1 tapGestureRecognizerを作成して、別のアクションを各ラベルにのviewDidLoadでそれを追加することができますか?

+1

なぜラベルの代わりにボタンを使用しませんか? – kirander

答えて

1

ラベルごとに1つだけ作成してください。

代わりに、すべてのターゲットビューの共通のスーパービューに添付する単一のタップジェスチャ認識器を作成し、ヒットテストを行うコードの集まりを作成して、タップがいずれかのラベル、そうであれば、そのラベルに対して所望のメソッドをディスパッチする。

ただし、これはタップジェスチャ認識ツールの全体的なポイントです。複数のタップジェスチャ認識機能を使用するよりも利点がないコードを数日間開発することになります。

1

単一のジェスチャ認識器の代わりに、すべてのラベルで1つのセレクタを共有することができます。ちょうどあなたのビューコントローラのプロパティとして、あなたのジェスチャー認識装置を宣言し、それがそのメソッドを呼び出すされた1確認するようにジェスチャーを切り替える:

class ViewController: UIViewController { 
    @IBOutlet weak var buttonOne: UILabel! 
    @IBOutlet weak var buttonTwo: UILabel! 
    var tap1: UITapGestureRecognizer! 
    var tap2: UITapGestureRecognizer! 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     buttonOne.isUserInteractionEnabled = true 
     buttonTwo.isUserInteractionEnabled = true 
     tap1 = UITapGestureRecognizer(target: self, action: #selector(tapAction)) 
     tap2 = UITapGestureRecognizer(target: self, action: #selector(tapAction)) 
     buttonOne.addGestureRecognizer(tap1) 
     buttonTwo.addGestureRecognizer(tap2) 
    } 
    @objc func tapAction(_ gesture: UITapGestureRecognizer) { 
     switch gesture { 
     case tap1: 
      print("buttonOne") 
     case tap2: 
      print("buttonTwo") 
     default: 
      break 
     } 
    } 
} 

は、編集:すでに@Duncan Cでコメントします。また、ジェスチャー認識のビューを切り替えることができます次のようになります。

class ViewController: UIViewController { 
    @IBOutlet weak var buttonOne: UILabel! 
    @IBOutlet weak var buttonTwo: UILabel! 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     buttonOne.isUserInteractionEnabled = true 
     buttonTwo.isUserInteractionEnabled = true 
     let tap1 = UITapGestureRecognizer(target: self, action: #selector(tapAction)) 
     let tap2 = UITapGestureRecognizer(target: self, action: #selector(tapAction)) 
     buttonOne.addGestureRecognizer(tap1) 
     buttonTwo.addGestureRecognizer(tap2) 
    } 
    @objc func tapAction(_ gesture: UITapGestureRecognizer) { 
     print("gesture") 
     guard let label = gesture.view as? UILabel else { return } 
     switch label { 
     case buttonOne: 
      print("buttonOne") 
     case buttonTwo: 
      print("buttonTwo") 
     default: 
      break 
     } 
    } 
} 
+0

...またはラベルをオンにすることもできます。しかし、述べられた目標は、ラベルごとに異なるメソッドを呼び出すことでした。 –

+0

私は試していませんが、送信者はラベルではないジェスチャ認識器です –

+0

ジェスチャを切り替えると、ヒットテストよりもはるかに簡単です –

関連する問題