※本記事は、旧ブログからの再掲です。

複数のビューを重ねた場合のタッチイベント受信処理について、
ハマってしまったので備忘録です。

図のように一番下の階層から ScrollView→UIView→UIViewとビューを重ね
UIView A → シングルタップイベント
UIView B → スワイプイベント
を受信できるように設定したのですが
いざ実行してみたら、UIView B上でシングルタップしても何も反応しませんでした。

<期待する動作>
 UIView B上でシングルタップをした場合にも、UIView Aの受信処理が起動する。

view_touch_1

ネットで調べてみたら、
どうやらScrollView上でタッチイベントを受信するためには
UIScrollViewのサブクラスを作ってタッチイベント関連のメソッド(touchesBegan等)を
オーバーライドすることが必要とあったので、
早速実践してみたのですが、何かまだ不備があるのか、やはり反応はありませんでした。
(※未だになぜ動かなかったのか原因不明ですが、何か分かったらこの記事をアップデートします。)

さらにAppleのサンプルコード(ScrollViewSuite)を見ながら手を入れてみたのですが
期待通りの動きをしなかったので、とうとう行き詰まってしまいました、、、

UIGestureRecognizerについては、レスポンダチェーンに参加しないということが頭にあったので
この場合には使えないと思い込んでいましたが、
ダメもとでこれを使って修正してみたら、出来ました!
UIView B上でシングルタップしても、UIView Aに登録した受信処理が起動しました。

UIView AとUIView Bで別々のジェスチャを受信登録していたので、
レスポンダチェーンのことは気にしなくて良かったようです。

ただ、UIView B を UIView A に addSubviewしないと UIView B上のシングルタップは検出されません。
(私はここでもハマってしまいました、、、)

今回のケースでは、
・ScrollView上にビューを重ねたこと
・UIGestureRecognizerはレスポンダチェーンに加わらないこと
を変に考慮したため、遠回りしてしまいましたが、これを考慮する必要はなかったようです。

ScrollView上でもUIGestureRecognizerを使用すれば、
UIScrollViewのサブクラスを作らなくてもタッチイベント処理を簡単に実装できますし、
UIGestureRecognizerでも違うイベントを受信するのであれば、レスポンダチェーンのことは
意識しなくても良いと分かりました。

というよりも、iOS3.2以降タッチイベントは、
UIGestureRecognaizerを使えば良いみたいです。

<参考>
[Appleドキュメント]iOSイベント処理ガイド

 


Comments are closed.