2012-09-21 8 views
8

Chcę, aby kilka moich kontrolerów aplikacji nie obracało się w systemie iOS 6.0. To, co zrobiłem, aby obrót w iOS 6 możliwych:iOS 6 ViewController obraca się, ale nie powinien

1.) Ustaw rootviewController okien w aplikacji: didFinishLaunchingWithOptions:

self.window.rootViewController = self.tabBarController; 

2.) Ustaw "Obsługiwane orientacje Interface" w moim docelowa (w Xcode), więc można korzystać ze wszystkich kierunków

3.) wdrożył nowe funkcjonalności iOS 6.0 obrót

- (BOOL) shouldAutorotate { 

    return YES; 
} 


-(NSUInteger)supportedInterfaceOrientations{ 

    return UIInterfaceOrientationMaskAll; 
} 

4.) Z pewnych powodów podklasowałem UINavigationController i zaimplementowałem te nowe funkcje i użyłem tego nowego NavigationController zamiast oryginalnego.

Jak na razie wszystko działa dobrze i wszystkie kontrolery widoku mogą się obracać do każdej orientacji. Teraz chcę, aby kilka viewController nie obracać i pozostają tylko w pionie. Ale kiedy ustawić nowe metody rotacje w tych konkretnych viewcontrollers tak, to nadal obraca się do każdej orientacji:

- (BOOL) shouldAutorotate { 

    return NO; 
} 


-(NSUInteger)supportedInterfaceOrientations{ 

    return UIInterfaceOrientationMaskPortrait; 
} 

ustawienie także rotationsfunctionality w navigationController niczym powyżej niczego nie zmienia. (Wszystkie kontrolery widoku mogą się obracać do każdej orientacji)

Co robię źle?

EDIT:

także ustawienie preferowane Interfaceorientation niczego nie zmienia:

- (UIInterfaceOrientation) preferredInterfaceOrientationForPresentation { 

    return UIInterfaceOrientationMaskPortrait; 
} 

Odpowiedz

11

Jeśli chcesz wszystkich naszych kontrolerów nawigacji szanować kontroler widoku z góry możesz użyć kategorii. Znalazłem to łatwiej niż podklasy.

@implementation UINavigationController (Rotation_IOS6) 

-(BOOL)shouldAutorotate 
{ 
    return [[self.viewControllers lastObject] shouldAutorotate]; 
} 

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

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation 
{ 
    return [[self.viewControllers lastObject] preferredInterfaceOrientationForPresentation]; 
} 

@end 
+0

Dzięki, to rozwiązało mój problem! – NicTesla

+5

Należy zachować ostrożność przy tym rozwiązaniu - jeśli metoda supportedInterfaceOrientations kontrolera widoku wywoła metodę supportedInterfaceOrientations na kontrolerze nawigacyjnym, wówczas masz nieskończoną rekursję. Znalazłem trudny sposób, w jaki UIPrintingProgressViewController firmy Apple prosi o kontroler nawigacji dla obsługiwanychInterfaceOrientations ... – tyler

+0

@tyler Jak sobie z tym poradzimy? Wydruk powoduje nieskończoną rekursję.I tak nie mogę tego naprawić. Użyłem powyższej kategorii do rotacji określonych kontrolerów widoku w mojej aplikacji. –

0

Działa to dla mnie:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    return NO; 
} 
+2

Dziękuję za szybką odpowiedź, ale ta metoda jest zdyskredytowana w systemie iOS 6. W systemie iOS 6 należy użyć dwóch metod: Zamiast tego należy zautomatyzować i obsłużyćInterfaceOrientations. – NicTesla

0

Musisz utworzyć kategorię UITabBarController wspierać powinny auto obracać

kod .h pliku jest

@interface UITabBarController (autoRotate)<UITabBarControllerDelegate> 

    -(BOOL)shouldAutorotate; 
    - (NSUInteger)supportedInterfaceOrientations; 

@end 

kod pliku .m jest

-(BOOL)shouldAutorotate { 

    AppDelegate *delegate= (AppDelegate*)[[UIApplication sharedApplication]delegate]; 
    return [delegate.tabBarController.selectedViewController shouldAutorotate]; 
} 


- (NSUInteger)supportedInterfaceOrientations { 
    return UIInterfaceOrientationMaskAll; 
} 

Uwaga: Nazwa AppDelegate zostanie zmieniona nazwą pliku AppDelegate twojego projektu.

+0

Odpowiedzi dotyczące tylko linków nie są mile widziane w StackOverflow. –

+0

Spammy, linki autopromocyjne również nie są mile widziane w Stack Overflow. –

Powiązane problemy