画面固定する

2011/12/26

画面固定/制御の方法よく忘れてしまうのでメモ

理屈的には、画面回転時の delegate メソッドで shouldAutorotateToInterfaceOrientation() で与えられた toInterfaceOrientation を判断する。

がその前に、回転に関しては UIDeviceOrientation、UIInterfaceOrientation 2種類存在する。

UIDeviceOrientation と UIInterfaceOrientation

UIDeviceOrientation はデバイスの向きを判別フラグだが、以下の7種類がある

typedef enum {
    UIDeviceOrientationUnknown,    //向き不明
    UIDeviceOrientationPortrait,            // HomeButton 下
    UIDeviceOrientationPortraitUpsideDown,  //HomeButton 上
    UIDeviceOrientationLandscapeLeft,       // HomeButton 右(左向き)
    UIDeviceOrientationLandscapeRight,      //HomeButton 左(右向き)
    UIDeviceOrientationFaceUp,              // 表
    UIDeviceOrientationFaceDown             // 裏
} UIDeviceOrientation;

UIInterfaceOrientation は以下の4種類

typedef enum {
    UIInterfaceOrientationPortrait           = UIDeviceOrientationPortrait, 
    UIInterfaceOrientationPortraitUpsideDown = UIDeviceOrientationPortraitUpsideDown,
    UIInterfaceOrientationLandscapeLeft      = UIDeviceOrientationLandscapeRight,
    UIInterfaceOrientationLandscapeRight     = UIDeviceOrientationLandscapeLeft
} UIInterfaceOrientation;

shouldAutorotateToInterfaceOrientation() の toInterfaceOrientation は UIInterfaceOrientation 型なのでこちらを利用します。 逆に UIDeviceOrientation は NSNotification で検知して、センサーアプリの判別に使う感じです。 (センサーアプリを作った事がないのであれですが・・・)

と言う訳で、UIInterfaceOrientation で画面向きの制御をしてみます。

常に回転させない

常に回転させない場合は、shouldAutorotateToInterfaceOrientation() を記述しないか、NOを返してやればよい。

-(bool)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    return NO;
}

よってアプリケーション単位で常に固定したい場合は、plist の Initial interface orientation で縦、横の設定をし、shouldAutorotateToInterfaceOrientation() しなければよい。 Orientation

また、Xcode4 では TARGETS > Summary に Supported Device Orientations 設定があり、サポートする回転設定が plist と連動するので便利です。 Orientation

ちなみに shouldAutorotateToInterfaceOrientation() も plist も設定しないと縦固定になるようです。

縦上固定

-(bool)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    return (toInterfaceOrientation == UIInterfaceOrientationPortrait);
}

縦下固定

-(bool)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    return (toInterfaceOrientation == UIDeviceOrientationPortraitUpsideDown);
}

縦固定

-(bool)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    return (interfaceOrientation == UIInterfaceOrientationPortrait
            || interfaceOrientation == UIDeviceOrientationPortraitUpsideDown);
}

左横固定

-(bool)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    return (toInterfaceOrientation == UIDeviceOrientationLandscapeLeft);
}

右横固定

-(bool)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    return (toInterfaceOrientation == UIDeviceOrientationLandscapeRight);
}

横固定

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationLandscapeRight
            || interfaceOrientation == UIInterfaceOrientationLandscapeLeft);
}

何か if 文で読みづらいのでサブクラスして、わかりやすくするのもありかな?とも思ったりします。。。