ローテーションジェスチャーを簡単に実装する

こんにちは、@yoheiMuneです。
今日は、iPhoneアプリケーションにおいて、簡単にローテーションジェスチャーを実装する方法を学んだので、ブログに残しておきたいと思います。


ローテーションジェスチャーとは

画面要素をくるくると回したいときに使うあれです。2本指で画面に触れ、2本指の距離を変えずに、指で円を描くように動くやり方です。
今日は、以下のような画面において、指の動き(ローテーションジェスチャー)に合わせて、表示されているUIImageViewを回転させます。




ローテーションジェスチャーを実装する

UIGestureRecognizerのひとつ、UIRotationGestureRecognizerを利用します。これを利用する事で、ローテーションジェスチャーが発生した際に、指定したメソッドを呼び出すことが出来ます。以下が、UIRotationGestureRecognizerの使用例です。

- (void)viewDidLoad {
  [super viewDidLoad];
	
  // インスタンス作成時に、ローテーションジェスチャー発生時に呼びだすメソッドを指定する
  UIRotationGestureRecognizer *rotation = [[[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotationAction:)] autorelease];
  // ローテーションジェスチャーをUIViewに設定する
  [self.view addGestureRecognizer:rotation];
}

ローテーションジェスチャーが発生したら

以下のメソッドが呼び出されるように、上記で実装しました。このメソッド内では、回転量を取得して、その回転量に応じて、UIImageViewを回転させています。
このメソッドは、ローテーションジェスチャー発生中に、何度も呼び出されます。

- (void)rotationAction : (UIRotationGestureRecognizer *)sender {

  // 回転した量を取得する。ここで取得出来るのは、radianという単位の値。
  // radianの詳細は、[wiki:ラジアン]を参照してください。
  CGFloat rotation = [sender rotation];

  // imgViewは回転対象のUIImageView。
  // CGAffineTransformMakeRotation関数を利用して、移動したradian分、imgViewを回転させる
  imgView.transform = CGAffineTransformMakeRotation(rotation);
}

参考

以下を参考にしました。ありがとうございます。
Event Handling Guide for iOS
UIRotationGestureRecognizer Class Reference



最後に

Viewの回転って難しそうで、意外と簡単に出来ました。ヨカタヨカタ♪(´ε` )
でもアフィン変形は難しそう。これから多用するだろうから、学ばねば。数学は、やっぱり必要なんですね。
最後に、以下は関連サイトです。参考になれば幸いです。