Смешанная ориентация для контроллера представления UINavigationController в приложении, управляемом TabBar - PullRequest
0 голосов
/ 07 января 2011

У меня есть приложение, которое имеет UITabBarController в качестве базового контроллера с UINavigationController для двух вкладок. Оба контроллера основного вида вкладки поддерживают как книжную, так и альбомную ориентации, но представление внука должно быть только в альбомной ориентации.

Проблема, с которой я столкнулся, заключается в том, что если вы начнете в портретной ориентации, прежде чем перейти к представлению внука, представление внука будет отображаться в портрете, даже если ChildViewController's shouldAutorotateToInterfaceOrientation возвращает YES только для ландшафтных режимов. То есть панель навигации отображается в верхней части устройства, как будто она находится в портретном режиме, а новый контроллер вида не поворачивается в принудительную ориентацию. Это выглядит так:

| [Navigation bar] |
|                  |
|  View contents   |
|                  |
|                  |
|                  |

Вместо правильно ориентированного макета:

|  [Navigation bar]               |
|                                 |
|   View contents, rotated        |

Как мне убедиться, что вид внука показан в правильной ориентации? Вот как я все настраиваю:

// first creating one of two view controllers used for the tabbar

UINavigationController *firstNavController = [[UINavigationController alloc] init];    

ContentOneListController *listController = [[[ContentOneListController alloc] initWithNibName:@"ContentOneView"                                                                                    bundle:nil] autorelease];    
listController.tabBarItem.title = @"One";

firstNavController.viewControllers = [NSArray arrayWithObject:listController];

// view controllers are added to the tabbar controller here (ivar of the class)
tabBarController = [[UITabBarController alloc] init];   
tabBarController.viewControllers = [NSArray arrayWithObjects:
        firstNavController, secondNavController, nil];

[window addSubview:tabBarController.view];
[window makeKeyAndVisible];

// later on, I add a child view controller onto ContentOneListController

NSArray *viewControllers = tabBarController.viewControllers;
NSInteger selectedIndex = [tabBarController selectedIndex]; 
UINavigationController *selectedNavController = [viewControllers objectAtIndex:selectedIndex];  

// ChildViewController only supports landscape orientation
ChildViewController *childController = [[[ChildViewController alloc] initWithNibName:@"ChildView"                                                                                      bundle:nil] autorelease];

[selectedNavController pushViewController:controller animated:NO];

ContentOneListController's shouldAutorotateToInterfaceOrientation возвращает YES для поддержки книжной и альбомной ориентации, тогда как ChildViewController's shouldAutorotateToInterfaceOrientation возвращает YES только для альбомной ориентации:

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)orientation 
{
    return (orientation == UIInterfaceOrientationLandscapeLeft ||
            orientation == UIInterfaceOrientationLandscapeRight);
}

Ответы [ 3 ]

1 голос
/ 16 января 2011

Способ исправить это путем настройки преобразования вида, как предлагается в этом вопросе:

Есть ли документированный способ установки ориентации iPhone?

0 голосов
/ 18 августа 2012

Я написал расширение, которое позволяет делать именно то, что вам нужно: https://github.com/piercifani/TabBarBetterRotation

0 голосов
/ 07 января 2011

Подкласс UITabBarController и реализовать shouldAutorotateToInterfaceOrientation для него

...