2013-05-23 3 views
0

У меня есть приложение iOS с раскадрой. Я хочу, чтобы мой последний диспетчер представлений всегда оставался в портретном режиме. Я читал, и я обнаружил, что сКак заставить контроллер просмотра оставаться в режиме портрета?

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 

осуждается я должен использовать другие методы, как

-(BOOL)shouldAutorotate 
-(NSInteger)supportedInterfaceOrientations 
-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation 

, но я попытался так много комбинаций этих методов, и я не был в состоянии сделать Это. Так, пожалуйста, может кто-нибудь сказать мне правильный путь?

+0

, что IOS с чем вы сталкиваетесь? какова иерархия рассматриваемого мнения? это внутри UINavigationController, UITabBarController? –

+0

iOS 6, он находится внутри UINavigationController – megara

+0

Один из способов, которым я решил это в прошлом, - использовать подкласс 'UINavigationController' и добавить свойство' allowRotation'. Тогда каждый из содержащихся 'UIViewControllers' в' UINavigationController' может установить это свойство по мере необходимости. Подкласс 'UINavigationController' может просто вернуть это свойство в свой метод' shouldAutorotate' –

ответ

5

Поскольку ваш UIViewController встроен в UINavigationController, он никогда не будет вызван, если вы не переадресовываете вызовы самостоятельно. (Немного изъян в UINavigationController на мой взгляд)

Подкласс UINavigationController так:

@interface RotationAwareNavigationController : UINavigationController 

@end 

@implementation RotationAwareNavigationController 

-(NSUInteger)supportedInterfaceOrientations { 
    UIViewController *top = self.topViewController; 
    return top.supportedInterfaceOrientations; 
} 

-(BOOL)shouldAutorotate { 
    UIViewController *top = self.topViewController; 
    return [top shouldAutorotate]; 
} 

@end 
+0

Вы рок-звезда! Это меня мучает годами. Ваше решение так приятно! Если бы я мог: -) – joehanna

1

Если у вас есть UIViewControllers в других UIViewControllers (например, UINavigationController или UITabBarController), вам необходимо проксировать эти сообщения дочернему объекту, для которого вы реализуете это поведение.

Установили ли вы контрольную точку в своих реализациях, чтобы убедиться, что ваш контроллер просмотра запрашивается?

1

В AppDelegate:

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 
{ 
    NSUInteger orientations = UIInterfaceOrientationMaskAllButUpsideDown; 

    if(self.window.rootViewController) { 
     UIViewController *presentedViewController = [[(UINavigationController *)self.window.rootViewController viewControllers] lastObject]; 
     orientations = [presentedViewController supportedInterfaceOrientations]; 
    } 

    return orientations; 
} 

В вашем ViewController:

- (NSUInteger)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskPortrait; 
} 
Смежные вопросы