UITAPGESTURERECOGNIZERのUIBUTTON
-
29-09-2019 - |
質問
私には、二重タップを検出するためのIBACTIONとUITAPGESTURERECOUGNIZERを備えたuibuttonがあります。
現時点では、Ibactionが認識者をブロックしているようです。これを停止する方法はありますか、それともボタンで作業することもできますか?もしそうなら、認識者を追加してiBactionsを削除する方が良いでしょうか?
編集
UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget : self action : @selector (handleDoubleTap:)];
[doubleTap setNumberOfTapsRequired:2];
[A1 addGestureRecognizer:doubleTap];
[A2 addGestureRecognizer:doubleTap];
[B1 addGestureRecognizer:doubleTap];
解決
1つのジェスチャー認識者を複数のボタンに添付しようとしているようです。ジェスチャー認識者は、一度に1つのビューにのみ添付できます。したがって、あなたの場合、(ボタンB1)に認識器を取り付けている最後のボタンは、おそらくダブルタップに応答しますが、A1とA2はそうではありません。
ボタンごとに個別の認識器を作成します。
しかし、3つの認識者全員が同じアクションメソッドを呼び出すことができます(handleDoubleTap:
).
ただし、ボタンを1回タップしようとすると、ダブルタップの開始かどうかを確認するのが待っているため、わずかな遅延があります。遅延を減らす方法はありますが、遅延とともに暮らすことができ、回避策が他の問題を引き起こす場合は価値がないかもしれません。
編集:
あなたのコメントでは、あなたは「それらが同時に押されているかどうかを検出したい」と言います。これを行うには、ジェスチャー認識者は必要ありません。提供される標準制御イベントを使用することができます。
次に、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で、 各 ボタン、「内部のタッチアップ」を接続します と 「外のタッチアップ」イベント 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およびButton Releasedメソッドを追加します。
- (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
}