1

I have a UIViewController that has an image view and a toolbar. I would like the toolbar to rotate, but the imageview to stay as it is. Is this possible?

Jhaliya - Praveen Sharma
  • 31,697
  • 9
  • 72
  • 76
Kyle
  • 17,317
  • 32
  • 140
  • 246

1 Answers1

2

Yes this is possible, but requires manual handling of rotate events.

In viewDidLoad, add

// store the current orientation
currentOrientation = UIInterfaceOrientationPortrait;
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self selector: @selector(receivedRotate:) name: UIDeviceOrientationDidChangeNotification object: nil];

if(currentOrientation != self.interfaceOrientation) {
    [self deviceInterfaceOrientationChanged:self.interfaceOrientation];
}

and don't forget to deregister events when the controller is removed. Then add a method for rotates:

// This method is called by NSNotificationCenter when the device is rotated.
-(void) receivedRotate: (NSNotification*) notification
{
    NSLog(@"receivedRotate");
    UIDeviceOrientation interfaceOrientation = [[UIDevice currentDevice] orientation];

    if(interfaceOrientation != UIDeviceOrientationUnknown) {
        [self deviceInterfaceOrientationChanged:interfaceOrientation];
    } else {
        NSLog(@"Unknown device orientation");
    }
}

and finally the rotate method

- (void)deviceInterfaceOrientationChanged:(UIInterfaceOrientation)interfaceOrientation {

    if(interfaceOrientation == currentOrientation) {
        NSLog(@"Do not rotate to current orientation: %i", interfaceOrientation);
    } else if(interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) {
        NSLog(@"Do not rotate to UIInterfaceOrientationPortraitUpsideDown");
    } else if(interfaceOrientation == UIInterfaceOrientationLandscapeLeft) {
        NSLog(@"Do not rotate to UIInterfaceOrientationLandscapeLeft");
    } else {

        if(!isRotating)
        {
            isRotating = YES;

            if(currentOrientation ==  UIInterfaceOrientationPortrait && interfaceOrientation == UIInterfaceOrientationLandscapeRight) {
                NSLog(@"Rotate to landscape");

                // rotate to right top corner
                [UIView beginAnimations:nil context:NULL];
                [UIView setAnimationDuration:0.5];

                // do your rotation here

                [UIView setAnimationDelegate:self];
                [UIView setAnimationDidStopSelector:@selector(animationDoneShowCaption:finished:context:)];
                [UIView commitAnimations];


            } else if(currentOrientation == UIInterfaceOrientationLandscapeRight && interfaceOrientation == UIInterfaceOrientationPortrait) {
                // etc
            }

            isRotating = NO;
        } else {
            NSLog(@"We are already rotating..");
        }
    }

    currentOrientation = interfaceOrientation;
}

Note that I do not allow for rotates in some directions, you might.

In addition, you need to make your components resizable / able to rotate.

Edit Consider using block-based animations instead and set the isRotation = NO in the completion block.

Community
  • 1
  • 1
ThomasRS
  • 8,215
  • 5
  • 33
  • 48