2013-02-21 24 views
13

Moja aplikacja może autorotować, ale potrzebuję jednego z widoków do pokazania tylko w trybie portretu i nie wiem, jak to osiągnąć.Zapobieganie autorotate dla jednego kontrolera widoku?

Próbowałem to (między innymi), ale widok w kwestii nadal obraca:

// ViewController.m 

-(BOOL)shouldAutorotate 
{    
    return NO; 
} 

- (NSUInteger)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskPortrait; 
} 

Może ktoś łaskawie wskazać, co robię źle? Dzięki.

-edit-

To dla iOS 6.1

+0

Jakiej wersji SDK się rozwijasz? –

+0

http://stackoverflow.com/questions/12630359/ios-6-how-do-i-restrict-some-views-to-portrait-and-allow-others-to-rotate – msk

+0

iOS 6, przepraszam. Zaktualizowałem OP. – Robert

Odpowiedz

30

Kiedy UINavigationController jest zaangażowany, utworzyć kategorię na UINavigationController i override supportedInterfaceOrientations.

#import "UINavigationController+Orientation.h" 

@implementation UINavigationController (Orientation) 

-(NSUInteger)supportedInterfaceOrientations 
{ 
    return [self.topViewController supportedInterfaceOrientations]; 
} 

-(BOOL)shouldAutorotate 
{ 
    return YES; 
} 

@end 

Teraz pojemniki iOS (takich jak UINavigationController) nie konsultować swoje dzieci, aby określić, czy powinny one AutoRotate.

Jak utworzyć kategorię
1. Dodaj nowy plik (cel kategorię c-pod dotyku kakao)
2. Category: Orientacja na UINavigationController
3. Dodaj powyższy kod do UINavigationController+Orientation.m

+0

Tak, istnieje 'UINavigationController' zaangażowany, ale muszę się przyznać nie wiedzieć dokładnie, co masz na myśli przez podklasę, ale przejdę do czytania. – Robert

+0

@Robert Wystarczy dodać kategorię na 'UINavigationController' zobaczyć moją zmienił –

+0

Odnosi się to również do rodzica UITabBarController – Halpo

2

Wersja Swift 3 zaakceptowana odpowiedź:

extension UINavigationController { 

    open override var supportedInterfaceOrientations: UIInterfaceOrientationMask { 
     // Change `.portrait` to whatever your default is throughout your app 
     return topViewController?.supportedInterfaceOrientations ?? .portrait 
    } 

    open override var shouldAutorotate: Bool { 
     return true 
    } 
}