UIViewController автоматически включить некоторые компоненты? - PullRequest
1 голос
/ 30 апреля 2011

У меня есть UIViewController, у которого есть изображение и панель инструментов. Я бы хотел, чтобы панель инструментов вращалась, но изображение оставалось таким, как есть. Возможно ли это?

1 Ответ

2 голосов
/ 30 апреля 2011

Да, это возможно, но требует ручной обработки событий поворота.

В viewDidLoad добавьте

// 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];
}

и не забудьте отменить регистрацию событий при удалении контроллера. Затем добавьте метод для поворотов:

// 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");
    }
}

и, наконец, метод поворота

- (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;
}

Обратите внимание, что я не могу вращаться в некоторых направлениях, вы могли бы.

Кроме того, вам нужно сделать так, чтобы ваши компоненты изменяли размеры / могли вращаться.

Редактировать Попробуйте вместо этого использовать анимации на основе блоков и установить isRotation = NO в блоке завершения.

...