2009年4月
« 3月   5月 »
 12345
6789101112
13141516171819
20212223242526
27282930  
2009/04/22

iPhoneの画面(UIView)を回転させる その2

以前投稿したiPhoneの画面(UIView)を回転させる その1では、UIViewのオートローテートについてでしたが、今回はプログラムで能動的に回転する方法です。

UIViewを回転するのは凄く簡単で、アフィン変換する為のプロパティと関数が用意されています。

UIView *view = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
view.transform = CGAffineTransformRotate( view.transform, angle );

以上のようなコードで簡単に回転できます。(angleの単位はラジアンです。)

アフィン変換の関数はCGPointに適用するものもあったりして、結構便利です。

以上の方法でプログラムから回転する事ができますが、AutoRotateの指定で自動で全てのViewを回転させるのではなく、向きが変わったタイミングで一部を回転させたい場合もあるかと思います。

 

その時は以下の3つの方法が考えられます。

1)加速度センサーを使う。
2)UIDeviceのorientationプロパティをチェックして処理を行う。
3)NSNortificationを使う。

 

1)については、加速度センサーの値をチェックして、Gがかかっている向きで端末の向きを判定すればOKですが、端末を振った時のGと重力のGとを勘違いしないように、適度なフィルタ処理を自前で実装する必要があり、そこそこ面倒です。

2)については、NSTimerでループを作って、UIDeviceのorientationプロパティを定期的にチェックすればOKですが、主に画面のタッチイベントで動作するようなイベントドリブンなアプリには不向きです。(OpenGLで作ったゲームや、メインループがあるようなアプリであれば、この方法も良いと思います。)

3)は、1)ほど実装が面倒でなく、且つ、2)のように自前でメインループを作るなどして定期的にチェックしなくても、端末が回転した時にイベントを受け取れるようにできる方法です。

 

やり方は簡単です。

 

Step1)端末の回転イベントが発生した時にdelegateしてもらう為の登録を行う。

UIDevice *device = [UIDevice currentDevice];
// 端末回転を検知する為の初期化処理
[device beginGeneratingDeviceOrientationNotifications];
// delegate先を登録
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center addObserver:self selector:@selector(deviceRotate:) name:UIDeviceOrientationDidChangeNotification object:nil];

 

Step2)Delegate先の実装

前述のコードの場合だと、deviceRotateが呼び出されるので、この中でUIDeviceのorientationプロパティの値をチェックすれば、端末の向きが変わったタイミングで、現在の向きに応じた処理(画面の一部を回転するetc)を行えます。

その1で投稿した内容と以上の方法で、端末の向きの検知とそれに伴うUIViewの回転処理については困ることは無いかと思います。


※iPhoneアプリ開発に関する投稿を今から始めるiPhoneアプリ開発にまとめました。

 

Comments are closed.