iPad: как отобразить другой экран в зависимости от ориентации (пейзаж / портрет) - PullRequest
0 голосов
/ 11 июля 2011

У меня есть приложение для iPad, которое можно использовать во всех четырех режимах просмотра (портрет вверх / вниз и пейзаж влево / вправо). Но в определенный момент у меня есть вид, который я хочу видеть только в режиме landscape . Поэтому я делаю следующее в UIViewController, который запускает действие для просмотра только в альбомной ориентации:

- (void) showProperty:(Property *) property {
    if ([self interfaceOrientation] == UIInterfaceOrientationLandscapeLeft || [self interfaceOrientation] == UIInterfaceOrientationLandscapeRight) {
        PropertyViewController *propertyView = [[PropertyViewController alloc] initWithNibName:@"PropertyViewController" bundle:[NSBundle mainBundle]];
        propertyView.property     = property;
        [self.navigationController pushViewController:propertyView animated:YES];
        [propertyView release];
        propertyView = nil;
    }
    else {
        RotateDeviceViewController *rotateView = [[RotateDeviceViewController alloc] initWithNibName:@"TabRotate" bundle: [NSBundle mainBundle]];
        rotateView.property = property;
        [self.navigationController pushViewController:rotateView animated:YES];
        [rotateView release];
        rotateView = nil;
    }
}

Это работает нормально и, таким образом, показывает либо нужный экран (PropertyViewController), когда iPad удерживается в ландшафтном режиме, а если нет, то показывает RotateDeviceViewController, который показывает пользователю сообщение о том, что он / она должен повернуть устройство, чтобы правильно просмотреть экран.

Поэтому, когда пользователь поворачивает свое устройство в альбомный режим, я хочу показать ему правильное представление (PropertyViewController). И все это вроде работает!

Проблема возникает, хотя в этом RotateDeviceViewController .. Там у меня есть следующее:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    if (UIInterfaceOrientationIsLandscape(interfaceOrientation))
        [self showProperty];
    return UIInterfaceOrientationIsPortrait(interfaceOrientation);
}

- (void) showProperty {
    PropertyViewController *propertyView = [[PropertyViewController alloc] initWithNibName:@"PropertyViewController" bundle:[NSBundle mainBundle]];
    propertyView.property     = property;
    [self.navigationController pushViewController:propertyView animated:YES];
    [propertyView release];
}

Поэтому, как только я поворачиваю устройство (при просмотре RotateDeviceViewController ) в альбомный режим, я показываю пользователю PropertyViewController . Это работает ... Но когда появляется PropertyViewController , он показывает мой макет повернутый на 90 градусов. Таким образом, в основном он отображает содержимое в режиме портрет вместо использования режима landscape (что фактически означает, что вы держите устройство) ..

Я надеюсь, что это имеет смысл, и кто-то может показать мне, что вызывает это.

Скриншоты, чтобы было понятнее:

1 Ответ

1 голос
/ 11 июля 2011

На данный момент

- (BOOL)shouldAutorotateToInterfaceOrientation:UIInterfaceOrientation)interfaceOrientation

Вы сообщаете контроллеру вида, какие ориентации вы поддерживаете. Устройство еще не было повернуто, поэтому свойство view controllers intefaceOrientation по-прежнему будет portrait, поэтому, когда оно помещается в стек, оно считает, что устройство portrait.

pseudo code
shouldAutoRotate... // at this point self.interfaceOrientation == portrait
                    // you push your controller here so it loads when the property is 

Я не уверен, что это будет работать хорошо, но самое раннее, что я вижу, вы можете нажать, это

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...