1つのジェスチャレコグナイザを複数のボタンに接続しようとしているようです。ジェスチャレコグナイザは、一度に1つのビューにのみアタッチできます。したがって、あなたの場合、レコグナイザーを接続している最後のボタン(ボタンB1)はおそらくダブルタップに反応しますが、A1とA2は反応しません。
ボタンごとに個別の認識機能を作成します。
ただし、3つの認識機能はすべて同じアクションメソッド(handleDoubleTap:
)を呼び出すことができます。
ただし、ボタンをシングルタップしようとすると、ダブルタップの開始かどうかを確認するために待機するため、わずかな遅延が発生します。遅延を減らす方法はいくつかありますが、遅延に耐えることができ、回避策によって他の問題が発生する場合は、その価値がない可能性があります。
編集:
あなたのコメントでは、「同時に押されているかどうかを検出したい」と言っています。これを行うには、ジェスチャ認識機能は必要ありません。提供されている標準の制御イベントを使用できます。
次に、IBで、ボタンごとに、「タッチダウン」イベントを。でフックしますbuttonPressed:
。または、プログラムでそれを行うには:
[button1 addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchDown];
[button2 addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchDown];
[button3 addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchDown];
次に、IBで、ボタンごとに、「TouchUpInside」イベントと「TouchUpOutside」イベントを。でフックしbuttonReleased:
ます。または、プログラムでそれを行うには:
[button1 addTarget:self action:@selector(buttonReleased:) forControlEvents:UIControlEventTouchUpInside|UIControlEventTouchUpOutside];
[button2 addTarget:self action:@selector(buttonReleased:) forControlEvents:UIControlEventTouchUpInside|UIControlEventTouchUpOutside];
[button3 addTarget:self action:@selector(buttonReleased:) forControlEvents:UIControlEventTouchUpInside|UIControlEventTouchUpOutside];
次に、ivarを追加して、押されたボタンの数またはボタンを追跡します。
@property (nonatomic) int numberOfButtonsBeingTouched;
@property (strong, nonatomic) NSMutableSet *buttonsBeingTouched; //alloc + init in viewDidLoad or similar
押されるボタンの数だけを気にする場合は、は必要ありませんNSMutableSet
。
最後に、buttonPressedメソッドとbuttonReleasedメソッドを追加します。
- (IBAction)buttonPressed:(UIButton *)button {
self.numberOfButtonsBeingTouched++;
[self.buttonsBeingTouched addObject:button];
//your logic here (if (self.numberOfButtonsBeingTouched == 3) ...)
}
- (IBAction)buttonReleased:(UIButton *)button {
self.numberOfButtonsBeingTouched--;
[self.buttonsBeingTouched removeObject:button];
//your logic (if any needed) here
}