Приложение для iPad с несколькими представлениями. Как сделать так, чтобы ОДИН вид отображался только в альбомной ориентации? - PullRequest
0 голосов
/ 11 июля 2011

После одобрительного ответа miamk я на шаг ближе к достижению того, чего хочу ... Но теперь возникает следующая проблема:

У меня есть приложение для iPad, которое можно использовать во всех четырех режимах просмотра (портрет вверх / вниз и пейзаж влево / вправо).Но в определенный момент у меня есть вид, который я хочу видеть только в режиме ландшафт .Поэтому я делаю следующее в 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, который показывает пользователю сообщение о том, что он / она должен повернуть устройство для правильного просмотра экрана.

Так что работает!

Тогда проблемавозникает в этом 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 (что на самом деле означает, что вы держите устройство) ..

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

Ответы [ 3 ]

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

Более элегантный обходной путь (по крайней мере, с точки зрения дизайна) ответа @ MacN00b заключается в настройке портретного представления с сообщением, сообщающим пользователю, что ему следует повернуть устройство, и только когда он поворачивает его, вы отображаете представление. построен для ландшафта.

Честно говоря, я думаю, что уродливо все поворачивать, когда пользователь все еще находится в портретной ориентации.

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

Вы можете прослушать изменения ориентации, используя:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:@"UIDeviceOrientationDidChangeNotification" object:nil];

А затем ответьте на них, загрузив соответствующий вид ...

- (void) orientationChanged:(id)object
{
    UIInterfaceOrientation interfaceOrientation = [[object object] orientation];

    if (interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)
    {
        self.view = self.portraitView;
    }
    if (interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight)
    {
        self.view = self.landscapeView;
    }
}

Если это относится к выделенному подклассу UIView для рассматриваемого экрана, вы можете включить в PortraitView метку, уведомляющую пользователя повернуть экран, чтобы просмотреть содержимое, а затем сделать альбомную ориентацию содержащей ваш фактический контент.

В настоящее время я делаю это в приложении, и оба представления содержатся в одном кончике. Просто убедитесь, что вы правильно установили ориентацию в свойствах вида в IB для каждого вида ...

0 голосов
/ 11 июля 2011

Попробуйте это:

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationLandscapeRight);
}

Надеюсь, это поможет.

...