2010年02月02日

タッチイベント処理の順番

iPhone SDK 3.1.2 において、タッチイベント処理が、
touchesBegan → touchesMoved x N → (touchesEnded or touchesCancelled)
という順番で来る想定でコードを書いていたら、マルチタッチ時に上手く動作しないという問題が発生しました。
この問題があるため、以前リリリースしたButterfly 15というアプリは、 画面を複数の指でタッチしまくっていると落ちます。なんてことだ。

ちょっと調べてみたところ、 「iPhoneアプリケーションプログラミングガイド: イベント処理」によると、 touchesBeganが何回か続けてくることもあるようです。
実際にも、指一本で画面に触れた後、離す前に別の指で画面に触るとtouchesBeganが呼び出されるようです。 UIViewのmultipleTouchEnabledをNOにしておいても呼び出されます。

というわけで、タッチイベント処理は、
touchesBegan → (touchesBegan or touchesMoved) x N → (touchesEnded or touchesCancelled)
という順番で来ることを想定しておく必要があるようです。
そもそも意図していない順番で呼び出された時は何もしないようなコードにしておけば良かったんですけどね。