西海岸より

つらつらざつざつと

デバイスの向きの設定と取得の方法

デバイスの向きに関することを調べたのでメモ。

Info.plistでアプリがサポートする向きを設定

[プロジェクト名]-Info.plistを編集し、以下の項目でアプリがサポートする向きを設定でき、サポートする向きを複数指定可能。

  • Supported interface orientations

ここで、Portrait (bottom home button)のみを指定すると縦(ホームボタン下)の向きのみサポートとなる。

ViewController上でのサポートするデバイスの向きを設定

各ViewController上で、以下のメソッドをオーバーライドすることにより、どの向きをサポートしているかを設定することができます。以下の場合は、縦方向のみサポート。

-(BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
  return (toInterfaceOrientation == UIInterfaceOrientationPortrait);
}
  • UIViewControllerのデフォルトはPortrait(ホームボタンが下)のみ。
  • UINavigationControllerのデフォルトは全方向に対応。

statusbarへの設定

statusbarも向きを持っており、以下のようにメソッドをコールすることで、statusbarの向きを変更することが可能です。

[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeLeft animated:NO];

デバイスの現在の向きを取得

  • 取得方法
    UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
  • UIDeviceOrientationのパターン(UIDevice.hより抜粋)
typedef enum {
    UIDeviceOrientationUnknown,
    UIDeviceOrientationPortrait,            // Device oriented vertically, home button on the bottom
    UIDeviceOrientationPortraitUpsideDown,  // Device oriented vertically, home button on the top
    UIDeviceOrientationLandscapeLeft,       // Device oriented horizontally, home button on the right
    UIDeviceOrientationLandscapeRight,      // Device oriented horizontally, home button on the left
    UIDeviceOrientationFaceUp,              // Device oriented flat, face up
    UIDeviceOrientationFaceDown             // Device oriented flat, face down
} UIDeviceOrientation;

デバイスの向きが変わったという通知を受け取る

NSNotificationCenterに登録することで可能。

  [[NSNotificationCenter defaultCenter] addObserver:self
                                           selector:@selector(didRotate:)
                                               name:@"UIDeviceOrientationDidChangeNotification"
                                             object:nil];  

通知を受け取ったメソッドでは、デバイスの向きを取得してその向きに応じた処理を実施。

- (void)didRotate:(id)sender {
    UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
  //処理

UIDeviceOrientationとUIInterfaceOrientation

結構ややこしいのがここ。デバイスの向きと、アプリの向きとで別定義がされているっぽく、Landscapeモード時のLeftとRightがそれぞれ逆の意味になってしまっているので注意。以下の実際の定義を見るとわかります。

  • UIInterfaceOrientationの定義(UIApplication.hより抜粋)
// Note that UIInterfaceOrientationLandscapeLeft is equal to UIDeviceOrientationLandscapeRight (and vice versa).
// This is because rotating the device to the left requires rotating the content to the right.
typedef enum {
    UIInterfaceOrientationPortrait           = UIDeviceOrientationPortrait,
    UIInterfaceOrientationPortraitUpsideDown = UIDeviceOrientationPortraitUpsideDown,
    UIInterfaceOrientationLandscapeLeft      = UIDeviceOrientationLandscapeRight,
    UIInterfaceOrientationLandscapeRight     = UIDeviceOrientationLandscapeLeft
} UIInterfaceOrientation;

iOSプログラミング逆引きリファレンス108 ?知りたいことがすぐわかるiPhoneプログラミングテクニック?

iOSプログラミング逆引きリファレンス108 ?知りたいことがすぐわかるiPhoneプログラミングテクニック?