今回もビックリザンス。
 さ~、testViewを2フィンガータップ対応させるザンスよ~、てinitWithFrameメソッドに

[self setMultipleTouchEnabled:YES];

 を追加して、まずはAppleのサンプルScrollViewSuiteで使ってる変数

twoFingerTapIsPossible
multipleTouches

 の変化を観察したれ~と、touchesBegan、touchesEnded、touchesCancelledをサンプルソースそっくりに実装して(コピペともいう)変数をコンソール出力させてみたんですわ。
 んで、以前の「iPhoneアプリ開発、その(72)」でマルチタッチの場合、touchesBegan、touchesEndedが入り乱れるのは知ってたので、以下のように実機で3本指のオペレーションを試してみたわけです。基本、指が触れるとtouchsBegan、離れるとtouchesEndedが呼び出されるので、非常に入り組んだイベント発生になるはず。

テン・シー・シー-1
予想では上から下に向かって図の順にtouchesBegan、touchesEndedが発生するはず

 で、コンソール見てるとtouchesBeganは予想どおりのタイミングで発生するけどtouchesEndedがまったく発生しないんですよ。
 注)ややこしくなるのでtestUIScrollView使わずUIScrollViewに戻してます。

 でもって、ちょっとでも指が動いてピンチやフリックと解釈されると、とたんにtouchesCancelledが飛んでくる。虎眼流の「流れ」並みに飛んでくる。UIViewがUIScrollViewに埋め込まれたら注意せよ。う~ん、ビックリでした。結局touchesEndedは指が全部離れた時に、いきなり2連続できたりと、まったく予想外。

テン・シー・シー-2

 ちょっと試しにscViewController.mをいじって、UIScrollViewに埋め込まずにそのまま配置(サンプルソースの#if ADD_DIRECT~#endifで囲まれた部分)してみたら、ちゃんと予想どおりの動きをするんですわ。

テン・シー・シー-3
ほらね、最初の画像と一致するでしょ

 [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