Search code examples
iphoneobjective-cscreen-orientationuiwindow

iPhone - UIWindow rotating depending on current orientation?


I am adding an additional UIWindow to my app. My main window rotates correctly, but this additional window I have added does not rotate.

What is the best way to rotate a UIWindow according to the current device orientation?


Solution

  • You need to roll your own for UIWindow.

    Listen for UIApplicationDidChangeStatusBarFrameNotification notifications, and then set the the transform when the status bar changes.

    You can read the current orientation from -[UIApplication statusBarOrientation], and calculate the transform like this:

    #define DegreesToRadians(degrees) (degrees * M_PI / 180)
    
    - (CGAffineTransform)transformForOrientation:(UIInterfaceOrientation)orientation {
    
        switch (orientation) {
    
            case UIInterfaceOrientationLandscapeLeft:
                return CGAffineTransformMakeRotation(-DegreesToRadians(90));
    
            case UIInterfaceOrientationLandscapeRight:
                return CGAffineTransformMakeRotation(DegreesToRadians(90));
    
            case UIInterfaceOrientationPortraitUpsideDown:
                return CGAffineTransformMakeRotation(DegreesToRadians(180));
    
            case UIInterfaceOrientationPortrait:
            default:
                return CGAffineTransformMakeRotation(DegreesToRadians(0));
        }
    }
    
    - (void)statusBarDidChangeFrame:(NSNotification *)notification {
    
        UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
    
        [self setTransform:[self transformForOrientation:orientation]];
    
    }
    

    Depending on your window´s size you might need to update the frame as well.