iPhoneはフリックやスワイプ、ピンチというジェスチャー概念の導入によって、チマチマしたスクロールバーから解放され、スタイラスペンのいらない実用的なタッチデバイスとなっているんだと思うわけですが、この機能の代表格であるUIScrollView、どうやれば使えるんでしょうか?
 試してみます。

 まずは「UIScrollViewはどこまで面倒見てくれるのか?」から。
 以下にSafariでサポートされてる代表的なジェスチャーコマンドを上げてみたんですが、どこまで勝手に面倒見てくれるんでしょう?

 ジェスチャ名  動作       Safariでの対応
 ダブルタップ  ポンポンと押す  ズームイン
 ドラッグ    引きずる     スクロール
 フリック    はじく      スクロール(一定時間自動)
 スワイプ    複数指でドラッグ スクロール
         なぞる
 ピンチオープン つまんで開く   ズームイン
 ピンチクローズ つまんで閉じる  ズームアウト

 ちなみに、この一覧のジェスチャー名称は「iPhoneヒューマンインターフェイスガイドライン(日本語訳)>iPhoneアプリケーションの設計:製品の定義からブランド設定まで>ジェスチャを適切にサポートする」を参考にしました。

追記;
 「iPhone OpenGL ES プログラミングガイド(日本語訳) 」もアップされてますたYooo。

 まずは、実践あるのみということで、実装してみます。
 参考にするサンプルプロジェクトは

ScrollViewSuite

 この中の一番単純なTapToZoom.xcodeprojから、UIScrollViewとそこに埋め込むUIViewの関係をさぐります。
 さっそく、新規プロジェクト作成~。今回はView-Based Application。

テン・シー・シー-1
新規プロジェクトメニューを選んで、あ、ワントゥスリ~。

テン・シー・シー-2
ディスクトップにscというプロジェクトで作成。ここらは適当に。

 で、こいつをビルドして実行しても、何が表示されるわけでもないので、新たにカスタムビューを用意して表示させてみます。まずはカスタムビュークラスの作成。

 testView.m/h

 とします。

テン・シー・シー-3
新規ファイルメニューを選んで、ワントゥスリフォーーーー!

テン・シー・シー-4
ヘッダーファイルも同時作成。保存先はどこでもいいけど、特に希望もないので他のファイルと同じ位置。

 あとは、testView.mの

- (void)drawRect:(CGRect)rect {
// Drawing code
}

 の中を埋めてやって、100ピクセルごとに格子を描いて、左上の位置を表示(描画処理を詳しく知りたい人は、ソースを参照)するようにします。で、これをscViewController.m側の注釈になってるloadViewを復活させて

- (void)loadView {
[super loadView];
testView* testview = [[testView alloc]
initWithFrame:CGRectMake(0, 0, 500, 500)];
[self.view addSubview:testview];
}

てふうにやると、以下のように表示されるわけです。

テン・シー・シー-5

 で、これをスクロール対応させるのが今回の課題。
 現状は、こんな感じで、もともとのビュー(仮にRootViewと呼ぶ)にtestViewが埋め込まれた状態。

テン・シー・シー-6
testViewの500x500すべての領域は表示されない。

 このRootViewとtestViewの間にUIScrollViewを間にかませる事で、スクロールができるかどうか、ズームイン・アウトなんかはどうなるかを実験します。さっきのloadViewメソッドを以下に変更。

- (void)loadView {
[super loadView];
testView* testview = [[testView alloc]
initWithFrame:CGRectMake(0, 0, 500, 500)];
UIScrollView* scrollview = [[UIScrollView alloc]
initWithFrame:self.view.bounds];
[self.view addSubview:scrollview];
[scrollview addSubview:testview];
}


 これで、以下のような入れ子状態になるわけっす。

テン・シー・シー-7

 で、スクロールするかなと触ってみても、なにも変化無し。これはスクロールするべき範囲が未指定だかららしく、以下の呼び出しを追加する事で解決します。

[scrollview setContentSize:testview.frame.size];

 ビルドして実行すると、ちゃんとドラッグでスクロールします。
 ここまでで、

ドラッグ
フリック
スワイプ

 がサポートされましたな。でもピンチ(ズーム)ジェスチャに反応しないんですよ。
 Appleのサンプルソースを調べてわかったんですが、これにはUIScrollViewにデリゲート(なんすか?デリゲート?な人は「iPhoneアプリ開発、その(6)」を参照)を設定して、
viewForZoomingInScrollViewメソッドを実装してやる必要があるみたいです。

 まずloadViewメソッドに

[scrollview setDelegate:self];

 を追加して、viewForZoomingInScrollViewメソッドを実装。

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
UIView *view = nil;
if (scrollView == scrollview) {
view = testview;
}
return view;
}

 これでUIScrollViewはズーム対象のUIViewがわかるようになるみたいっす。
 ただ~し、このままだとUIScrollViewの拡大、縮小のリミットが1.0のままで、結局何の効果もない状態になってるんで、こいつも設定する必要があります。loadViewメソッドに以下の呼び出しを追加して、UIScrollViewのズーム範囲を1/10倍~10倍(値は適当)に設定します。

[scrollview setMinimumZoomScale:0.1];
[scrollview setMaximumZoomScale:10.0];

 で、このままだと「UIScrollViewのデリゲートにscViewControllerを指定してるけど、そいつはUIScrollViewのデリゲートがもつべきメソッドを持ってないと思われ」というワーニングがうるさいので、scViewController.h側の定義を

@interface scViewController : UIViewController {

 から

@interface scViewController : UIViewController<UIScrollViewDelegate> {

 に変更(この一連の作業はプロトコルの継承になるんだけど、わからない人は「Objective-C 2.0 プログラミング言語(日本語訳)」をがんばって読みましょう。「iPhoneアプリ開発、その(89)」でも軽くふれてます)して、あとはビルドして実行~!
 どうすか、ちゃんとズームイン/アウトできたでしょ。

テン・シー・シー-8
ほらね。

 ちなみに、シミュレータでも、オプションキー押すと2つめの指が現れてピンチやスワイプ(オプションキー+シフトキーで2つの指の距離を保ったまま移動)が試せるようになっとります(バージョン3.0からの機能なのか、元々あったのかは不明)。
 ここまでで、

ドラッグ
フリック
スワイプ
ピンチオープン
ピンチクローズ

 がサポートされましたな。んでも、ダブルタップでズームインにはならないみたい。こいつは自分で実装する必要があるみたいっすね~。
 以下次回!

------------
サンプルプロジェクト:sc.zip