画面の回転制御を自分(手動)で行う

iOS開発の場合、このアプリは横向き対応だよ、縦向き対応だよ、とか宣言して、あとは
shouldAutorotateToInterfaceOrientationでyesを返しておけば、勝手に回転してくれます。
まぁ、普通はこれでいいんです。便利です。良く出来ています。

でもカメラアプリなどで基本的な向きは勝手に変わって欲しくないけど、一部のUIだけは回転したい。
そんな時はこんな感じでいけます。

まず、向きが変更された事を通知してもらうために下記のコードをロードなどに仕込んでおきます。


[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter]
     addObserver:self selector:@selector(deviceRotated:) 
     name:UIDeviceOrientationDidChangeNotification object:nil];

変更の通知を受けて、この例ではUIButtonのアイコンイメージを回転させています。

- (void) deviceRotated:(NSNotification *)notification
{
   
    UIDeviceOrientation orientation = [[notification object] orientation];
   
    // UIDeviceOrientationPortrait     縦向きで、ホームボタンは下
    // UIDeviceOrientationUpsideDown     縦向きで、ホームボタンが上
    // UIDeviceOrientationLandscapeLeft     横向きで、ホームボタンが右
    // UIDeviceOrientationLandscapeRight     横向きで、ホームボタンが左
    // UIDeviceOrientationFaceUp     画面が上向き
    // UIDeviceOrientationFaceDown     画面が下向き
    // UIDeviceOrientationunKnown     画面の向きが分からない


    //使えない向きの時は処理しない
    if (orientation == UIDeviceOrientationPortraitUpsideDown
        || orientation == UIDeviceOrientationFaceUp
        || orientation == UIDeviceOrientationFaceDown
        || orientation == UIDeviceOrientationunKnown)
    {
        return;
    }
   
    //向きに応じた角度を求める
    int angle = 0;
    if (orientation == UIDeviceOrientationPortrait)
    {
        angle = 0;
    }
    else if (orientation == UIDeviceOrientationLandscapeLeft)
    {
        angle = 90;
    }
    else if (orientation == UIDeviceOrientationLandscapeRight)
    {
        angle = 270;
    }



    //回転させるためのアフィン変形を作成する
    CGAffineTransform t = CGAffineTransformMakeRotation(angle * M_PI / 180);
   
    //アニメーション付きでボタンを回転
    [UIView beginAnimations:@"device rotation" context:nil];
    [UIView setAnimationDuration:0.3];
   
    xxxxButton.transform = t;
   
    [UIView commitAnimations];

}

他にも回転させたいUIがあればそれらを回転させてあげればOK
ただし、回転するってことはframeのサイズも変わる場合があるのでそのへんは調整する必要があります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です