2012-09-30 25 views
17

W iOS6, shouldAutorotateToInterfaceOrientation jest przestarzałe. Próbowałem użyć supportedInterfaceOrientations i shouldAutorotate, aby aplikacja działała poprawnie w trybie autorotacji, ale nie udało się.Jak sprawić, by aplikacja działała poprawnie w trybie autorotacji w systemie iOS 6?

Ten ViewController Nie chcę obracać, ale to nie działa.

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

-(BOOL)shouldAutorotate 
{ 
    return NO; 
} 

-(NSUInteger)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskPortrait; 
} 

Jakieś pomysły? Dzięki za pomoc z góry!

+0

Czy kontroler widoku jest osadzony w kontrolerze nawigacyjnym lub kontrolerze kart? – Felix

+0

osadzone w kontrolerze nawigacyjnym. @ phix23 – Carina

Odpowiedz

38

Wyliczyłem to.

1) podklasy UINavigationController (górna viewcontroller hierarchii będzie przejąć kontrolę nad orientacją.) nie ustawić go jako self.window.rootViewController.

- (BOOL)shouldAutorotate 
{ 
    return self.topViewController.shouldAutorotate; 
} 
- (NSUInteger)supportedInterfaceOrientations 
{ 
    return self.topViewController.supportedInterfaceOrientations; 
} 

2) jeśli nie chcesz widok kontroler obracać

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

-(BOOL)shouldAutorotate 
{ 
    return NO; 
} 

-(NSUInteger)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskPortrait; 
} 

3) Jeśli chcesz, aby móc obracać

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

-(NSUInteger)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskAllButUpsideDown; 
} 

-(BOOL)shouldAutorotate 
{ 
    return YES; 
} 

BTW Według do Twoich potrzeb, inna powiązana metoda:

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 
{ 
    return UIInterfaceOrientationMaskPortrait; 
} 
+2

+1 za udzielenie odpowiedzi na własne pytanie z kilkoma przykładami kodu –

+0

Próbowałem tej metody i działa dobrze. – Robert

+0

Dlaczego nadpisujesz '- (BOOL) shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation) interfaceOrientation'? Jest przestarzałe i nigdy nie wywołuje – voromax

3

Jeśli używasz kontrolera paska kart zamiast kontrolera nawigacyjnego jako kontrolera głównego, będziesz musiał podobnie wykonać podklasę UITabBarController.

Również składnia będzie inna. Użyłem następujących z powodzeniem. Następnie użyłem powyższych przykładów z powodzeniem na kontrolerach widoku, które chciałem zastąpić. W moim przypadku chciałem, aby ekran główny się nie obracał, ale miałem ekran FAQ z filmami, które naturalnie chciałem włączyć widok krajobrazu. Działa doskonale! Po prostu zanotuj zmianę składni w self.modalViewController (otrzymasz ostrzeżenie kompilatora, jeśli spróbujesz użyć składni kontrolera nawigacyjnego). Mam nadzieję, że to pomoże!

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

- (BOOL)shouldAutorotate 
{ 
    return self.modalViewController.shouldAutorotate; 
} 

- (NSUInteger)supportedInterfaceOrientations 
{ 
    return self.modalViewController.supportedInterfaceOrientations; 
}