2012/07/12更新

[XCODE] iPhoneアプリでデバイスの回転を独自に対応する

このエントリーをはてなブックマークに追加            

こんにちは、@yoheiMuneです。

今日は、iPhone/iPadアプリケーションで、デバイスの回転に独自に対応する方法を学んだので、ブログに残しておきたいと思います。

f:id:yoheiM:20111007190703j:image




まずはデバイスの回転を感知して、必要に応じて各種アイテムを回転させる

デバイス回転を独自に感知するには、UIDeviceクラスとNSNotificationCenterクラスを利用します。 詳しい利用方法は、”iPhoneの向きを特定するもう一つの方法@YoheiM.NET”を参考にしてみて下さい。

デバイスが回転したら、特定のメソッドが呼び出されるように設定します。

// ViewControllerの実装にて
- (void)viewDidLoad {
  [super viewDidLoad];

  // デバイスの回転を開始する
  [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
  // デバイスが回転した際に、呼び出してほしいメソッドを設定する。
  // 今回は、selfのdidRotate:というメソッドを呼び出し対象に設定してみました。
  [[NSNotificationCenter defaultCenter] addObserver:self 
                                                         selector:@selector(didRotate:) 
                                                             name:UIDeviceOrientationDidChangeNotification 
                                                            object:nil];
}


デバイスが回転したら、以下のメソッドが呼び出されます。

このメソッドの中で、デバイスの向きに合わせて画面上のアイテムを回転します。

また、ステータスバーの位置も修正します。

// デバイスが回転した際に、呼び出されるメソッド
- (void) didRotate:(NSNotification *)notification {
  UIDeviceOrientation o = [[notification object] orientation];

  // 縦向きで、ホームボタンが下になる向き
  if (o == UIDeviceOrientationPortrait) {

    // 画面上の各種アイテムを回転させる為に作ったメソッド。内容は下を参照ください。
    [self correspondToDeviceRotation:0];
    // ステータスバーの位置を変更する。
    [[UIApplication sharedApplication] setStatusBarOrientation:UIDeviceOrientationPortrait animated:YES];

  // 縦向きで、ホームボタンが上になる向き
  } else if (o == UIDeviceOrientationPortraitUpsideDown) {
    [self correspondToDeviceRotation:180];
    [[UIApplication sharedApplication] setStatusBarOrientation:UIDeviceOrientationPortraitUpsideDown animated:YES];

  // 横向きで、ホームボタンが右になる向き
  } else if (o == UIDeviceOrientationLandscapeLeft) {
    [self correspondToDeviceRotation:90];
    [[UIApplication sharedApplication] setStatusBarOrientation:UIDeviceOrientationLandscapeLeft animated:YES];

  // 横向きで、ホームボタンが左になる向き
  } else if (o == UIDeviceOrientationLandscapeRight) {
    [self correspondToDeviceRotation:270];
    [[UIApplication sharedApplication] setStatusBarOrientation:UIDeviceOrientationLandscapeRight animated:YES];

  // 画面が上向き
  } else if (o == UIDeviceOrientationFaceUp) {
    NSLog(@"device orientation is Face Up.");
    // no need actions.

  // 画面が下向き
  } else if (o == UIDeviceOrientationFaceDown) {
    NSLog(@"device orientation is Face Down.");
    // no need actions.

  // 向きが不明な場合
  } else {
    NSLog(@"device orientation is Unkown.");
    // no need actions.

  }
}

// 画面上の各種アイテムを回転させるメソッド
- (void) correspondToDeviceRotation : (int)angle {

  // 回転させるためのアフィン変形を作成する
  CGAffineTransform t = CGAffineTransformMakeRotation(angle * M_PI / 180);

  // 回転させるのにアニメーションをかけてみた
  [UIView beginAnimations:@"device rotation" context:nil];
  [UIView setAnimationDuration:0.3];

  trustButton.transform= t;  // ゴミ箱ボタン
  undoButton.transform= t;  // Redoボタン
  redoButton.transform= t;  // Undoボタン

  // アニメーション開始
  [UIView commitAnimations];
}

ここでは、デバイスの向きに合わせて、アフィン変換を利用して、 ボタンの回転を行っています。アフィン変換の回転については、 ”ローテーションジェスチャーを簡単に実装する@YoheiM.NET”を 参考にして頂けると幸いです。




独自にデバイスの回転に対応する上で大切なこと

それは、ステータスバーの位置を、デバイスの向きによってちゃんと変える事です。

これを行う事で、新しく開くView(例:UIImagePickerView)などの向きを変えることが出来ます。

動作させたところ、ステータスバーが上になるようにUIViewの向きが決定されるようです。

という事で、ステータスバーの位置変更も忘れず行うと、デバイスの回転に自分で対応することは、出来るようです。




最後に

デバイス回転を、「shouldAutorotateToInterfaceOrientation:」メソッドを使わずに行う方法には、かなり悩まされました。

でも、いったんの上記のような解決策を作れて良かったヨカッタ♪(´ε` )

iPhoneアプリ作成では、学ぶ事がホントに多いですね。もっと実力をつけねば。







こんな記事もいかがですか?

RSS画像

もしご興味をお持ち頂けましたら、ぜひRSSへの登録をお願い致します。