Replicate camera app rotation to landscape IOS 6 iPhone

ios, landscape, portrait, uiimagepickercontroller

Solution

OK, so I've managed to sort this out. A thing to note is the UIImagePickerController class supports portrait mode only as per Apple documentation.

To capture the rotation the `willRotateToInterfaceOrientation` is useless here, so you have to use notificatons. Also setting autolayout contraints at runtime is not the way to go.

In the AppDelegate `didFinishLaunchingWithOptions` you need to enabled rotation notifications:

// send notification on rotation
[[UIDevice currentDevice]beginGeneratingDeviceOrientationNotifications];

In `viewDidLoad` method of the cameraOverlayView `UIViewController` add the following:

//add observer for the rotation notification
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:nil]; 

Finally add the `orientationChanged:` method to the cameraOverlay `UIViewController`

- (void)orientationChanged:(NSNotification *)notification
{
    UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
    double rotation = 0;

    switch (orientation) {
        case UIDeviceOrientationPortrait:
            rotation = 0;
            break;
        case UIDeviceOrientationPortraitUpsideDown:
            rotation = M_PI;
            break;
        case UIDeviceOrientationLandscapeLeft:
            rotation = M_PI_2;
            break;
        case UIDeviceOrientationLandscapeRight:
            rotation = -M_PI_2;
            break;
        case UIDeviceOrientationFaceDown:
        case UIDeviceOrientationFaceUp:
        case UIDeviceOrientationUnknown:
        default:
            return;
    }
    CGAffineTransform transform = CGAffineTransformMakeRotation(rotation);
    [UIView animateWithDuration:0.4 delay:0.0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{
        self.btnCancel.transform = transform;
        self.btnSnap.transform = transform;     
    }completion:nil];
}

The above code applies the rotation transform on the 2 UIButtons I am using in this case btnCancel and btnSnap. This gives you the Camera app effect when rotating the device. I am still getting a Warning in the console `<Error>: CGAffineTransformInvert: singular matrix.` not sure why this is happening but it is something to do with the camera view.

Hope the above helps.

Problem

Hi I am trying to replicate the same rotation which can be seen in the camera app when orientation is shifted to landscape. Unfortunately I've had no luck. I need to set this up for the custom cameraOverlayView with UIImagePickerController. From this portrait (B are UIButtons) ``` |-----------| | | | | | | | | | | | | | B B B | |-----------| ``` To this landscape ``` |----------------| | B | | | | B | | | | B | |----------------| ``` In other words I would like the buttons to stick to the original portrait bottom and rotate on their centres. I am using Storyboards and Autolayout is enabled. Any help is greatly appreciated.

Original source

Related problems