今回もビックリザンス。
さ~、testViewを2フィンガータップ対応させるザンスよ~、てinitWithFrameメソッドに
を追加して、まずはAppleのサンプルScrollViewSuiteで使ってる変数
の変化を観察したれ~と、touchesBegan、touchesEnded、touchesCancelledをサンプルソースそっくりに実装して(コピペともいう)変数をコンソール出力させてみたんですわ。
んで、以前の「iPhoneアプリ開発、その(72)」でマルチタッチの場合、touchesBegan、touchesEndedが入り乱れるのは知ってたので、以下のように実機で3本指のオペレーションを試してみたわけです。基本、指が触れるとtouchsBegan、離れるとtouchesEndedが呼び出されるので、非常に入り組んだイベント発生になるはず。
予想では上から下に向かって図の順にtouchesBegan、touchesEndedが発生するはず
で、コンソール見てるとtouchesBeganは予想どおりのタイミングで発生するけどtouchesEndedがまったく発生しないんですよ。
注)ややこしくなるのでtestUIScrollView使わずUIScrollViewに戻してます。
でもって、ちょっとでも指が動いてピンチやフリックと解釈されると、とたんにtouchesCancelledが飛んでくる。虎眼流の「流れ」並みに飛んでくる。UIViewがUIScrollViewに埋め込まれたら注意せよ。う~ん、ビックリでした。結局touchesEndedは指が全部離れた時に、いきなり2連続できたりと、まったく予想外。
ちょっと試しにscViewController.mをいじって、UIScrollViewに埋め込まずにそのまま配置(サンプルソースの#if ADD_DIRECT~#endifで囲まれた部分)してみたら、ちゃんと予想どおりの動きをするんですわ。
ほらね、最初の画像と一致するでしょ
[touches count]と[[event touchesForView:self] count]もそれらしい値が返ってる。
なので、例えば2本の指が触れている状態から1本だけ指が離れた場合
となるわけで、この値が一致した時、最後の指が離れたとみなしていいと、Appleの日本語ドキュメント「iPhoneアプリケーションプログラミングガイド>イベント処理>マルチタッチイベントの処理>イベント処理のテクニック」でも書かれとるわけです。というわけで、この説明はUIScrollViewに埋め込んでいなければ、十分当てになります。Appleのサンプルもそういう前提で実装してるみたいだけど...
まあ、Appleのサンプル書いた人も予想外のUIScrollViewの動作ですな。
とりあえず、サンプルソースの実装はUIScrollViewにaddSubViewしない時の状態を前提としてるみたいっす。結果的に問題なく動くみたいなんで、よしとしておきましょう。
詳細はサンプルソース見てね!
あと、今回Appleのサンプルにあわせて
にしてます。
------------
サンプルプロジェクト:sc4.zip
さ~、testViewを2フィンガータップ対応させるザンスよ~、てinitWithFrameメソッドに
[self setMultipleTouchEnabled:YES];
を追加して、まずはAppleのサンプルScrollViewSuiteで使ってる変数
twoFingerTapIsPossible
multipleTouches
の変化を観察したれ~と、touchesBegan、touchesEnded、touchesCancelledをサンプルソースそっくりに実装して(コピペともいう)変数をコンソール出力させてみたんですわ。
んで、以前の「iPhoneアプリ開発、その(72)」でマルチタッチの場合、touchesBegan、touchesEndedが入り乱れるのは知ってたので、以下のように実機で3本指のオペレーションを試してみたわけです。基本、指が触れるとtouchsBegan、離れるとtouchesEndedが呼び出されるので、非常に入り組んだイベント発生になるはず。
予想では上から下に向かって図の順にtouchesBegan、touchesEndedが発生するはず
で、コンソール見てるとtouchesBeganは予想どおりのタイミングで発生するけどtouchesEndedがまったく発生しないんですよ。
注)ややこしくなるのでtestUIScrollView使わずUIScrollViewに戻してます。
でもって、ちょっとでも指が動いてピンチやフリックと解釈されると、とたんにtouchesCancelledが飛んでくる。虎眼流の「流れ」並みに飛んでくる。UIViewがUIScrollViewに埋め込まれたら注意せよ。う~ん、ビックリでした。結局touchesEndedは指が全部離れた時に、いきなり2連続できたりと、まったく予想外。
ちょっと試しにscViewController.mをいじって、UIScrollViewに埋め込まずにそのまま配置(サンプルソースの#if ADD_DIRECT~#endifで囲まれた部分)してみたら、ちゃんと予想どおりの動きをするんですわ。
ほらね、最初の画像と一致するでしょ
[touches count]と[[event touchesForView:self] count]もそれらしい値が返ってる。
[touches count] touchesEndedを引き起こした指の数
[[event touchesForView:self] count] 現在追跡中のtestViewに関係する指の数
なので、例えば2本の指が触れている状態から1本だけ指が離れた場合
[touches count] = 1
[[event touchesForView:self] count] = 2
となるわけで、この値が一致した時、最後の指が離れたとみなしていいと、Appleの日本語ドキュメント「iPhoneアプリケーションプログラミングガイド>イベント処理>マルチタッチイベントの処理>イベント処理のテクニック」でも書かれとるわけです。というわけで、この説明はUIScrollViewに埋め込んでいなければ、十分当てになります。Appleのサンプルもそういう前提で実装してるみたいだけど...
まあ、Appleのサンプル書いた人も予想外のUIScrollViewの動作ですな。
とりあえず、サンプルソースの実装はUIScrollViewにaddSubViewしない時の状態を前提としてるみたいっす。結果的に問題なく動くみたいなんで、よしとしておきましょう。
詳細はサンプルソース見てね!
あと、今回Appleのサンプルにあわせて
シングルタップ なにもしない。
ダブルタップ tapLocationを中心にズームアウトする。
2フィンガータップ tapLocationを中心に1:1に戻す。
にしてます。
------------
サンプルプロジェクト:sc4.zip