Attention! Translated article might be found on my English blog.

2016年7月23日土曜日

UIGestureRecognizerの利用でUIButtonの反応が鈍くなった場合の対処

uigesturerecognizer - UITapGestureRecognizer waiting for second tap, buttons slow - Stack Overflowを参考にすると、どうやらダブルタップ入力待ちのために一瞬固まるように見えてしまうようだ。(もしかするとダブルタップ用ジェスチャを外すと治るのかも)
この対策として、「ボタン類にタップした時はジェスチャ判定を行わない」という処理を追加する。
具体的にはUIGestureRecognizerのdelegateにUIGestureRecognizerDelegateプロトコル対応クラスのオブジェクトをセットし、
そのクラスにてgestureRecognizer:shouldReceiveTouch:を実装する。
UIControl類をタップした時に無視する場合は以下のようなコードで良さそうだ。


- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { // ボタンやテキストフィールドに対してはジェスチャ判定は行わない return ![[self hitTest:[touch locationInView:self] withEvent:nil] isKindOfClass:[UIControl class]]; }

ここで、selfはUIViewのサブクラスのオブジェクトでUIGestureRecognizerDelegateプロトコルに対応させてあり、使用するジェスチャのdelegateとしてセット済み。