2012-09-24 14 views
14

Używam tego kodupresentViewController nie wspiera orientację w iOS 6

if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]) 
    { 
     [self presentViewController:navigationControllerCustom animated:YES completion:nil]; 
    } 
    else 
    { 
     [self presentModalViewController:navigationControllerCustom animated:YES]; 
    } 

Moja aplikacja ma dwa orientacji pionowej i Portret góry nogami. Ten kod działa dobrze z iOS 5.1, ale orientacja nie działa na iOS 6

Dodałem także ten kod na moim navigationControllerCustom klasy

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

-(NSUInteger)supportedInterfaceOrientations 
{ 
    return (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown); 
} 

Proszę mi pomóc rozwiązać ten problem.

Z góry dziękuję.

+2

Mam ten sam problem w moich aplikacjach skompilowałem na iOS 6; wszystkie orientacje działają z wyjątkiem UInterfaceOrientationPortraitUpsideDown; to dziwne. – MrJre

+0

@MrJre Każde rozwiązanie na tym samym poziomie jest naprawdę dziwne. –

Odpowiedz

25

Należy uwzględnić to w was aplikacji delegata:

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

Również upewnić View sterownika oba mają następujące, działa dobrze dla mnie.

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

-(NSUInteger)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown; 
} 

Dokumentacja mówi również, że UINavigationController's nie zapytać jego widok z góry kontrolera dla kierunków obsługiwanych, chociaż Apple inżynier ponad na Forum programistów nie powiedzieć tak ... wydaje się, że tak nie jest. Dlatego należy dodać kategorię dla UINavigationController, to jest jeden używam:

#import "UINavigationController+autorotate.h" 

@implementation UINavigationController (autorotate) 

- (NSUInteger)supportedInterfaceOrientations{ 
    return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown; 
} 

@end 

Aby uzyskać więcej informacji jak AutoRotate działa na iOS 6 check out this answer

+0

Doskonała odpowiedź, rozwiązałeś mój problem, dzięki :-) –

+1

Kategoria UINavigationController była wystarczająca. – Gujamin

+0

+1 Część delegata aplikacji była bardzo pomocna. –

2

Zapomniałaś:

- (BOOL)shouldAutorotate { 
    return YES; 
} 
+0

Dziękuję za odpowiedź. Dodałem, ale to nie działa, żadnej innej rzeczy, której mi brakuje. –

+0

W swoim pliku Info.plist w obsługiwanych orientacjach interfejsu, czy masz portret i portret do góry nogami? – rocky

+0

Tak, ja też to zrobiłem, jakakolwiek inna rzecz? –

1

Wystarczy skopiować pasty że urywek powyżej kodzie

@implementation UINavigationController (rotation) 
//temp hack for iOS6, this allows passing supportedInterfaceOrientations to child viewcontrollers. 
- (NSUInteger)supportedInterfaceOrientations { 
return [self.topViewController supportedInterfaceOrientations]; 
} 

@end 
1

Jeśli planujesz włączyć lub wyłączyć rotację dla wszystkich kontrolerów widoku, nie potrzebujesz podklasy UINavigationController. Zamiast używać:

-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 

w AppDelegate.

Jeśli zamierzasz obsługiwać wszystkie kierunki w swojej aplikacji, ale różne orientacje na RODZICÓW Zobacz Controllers (UINavigationController stos na przykład) należy użyć

-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 

w połączeniu z poniższych metod w swojej dominującej View Controller.

- (BOOL)shouldAutorotate 

i

- (NSUInteger)supportedInterfaceOrientations 

Ale jeśli planujesz mieć różne ustawienia orientacji w różnych DZIECI ViewControllers w tym samym stosie nawigacji (jak ja), trzeba sprawdzić aktualną ViewController w stosie nawigacji.

Utworzyłem następujących w moim UINavigationController podklasy:

- (BOOL)shouldAutorotate 
{ 
    return YES; 
} 

- (NSUInteger)supportedInterfaceOrientations 
{ 
    int interfaceOrientation = 0; 

    if (self.viewControllers.count > 0) 
    { 
     id viewController; 
     DLog(@"%@", self.viewControllers); 
     for (viewController in self.viewControllers) 
     { 
      if ([viewController isKindOfClass:([InitialUseViewController class])]) 
      { 
       interfaceOrientation = UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown; 
      } 
      else if ([viewController isKindOfClass:([MainViewController class])]) 
      { 
       interfaceOrientation = UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown; 
      } 
      else 
      { 
       interfaceOrientation = UIInterfaceOrientationMaskAllButUpsideDown; 
      } 
     } 
    } 
    return interfaceOrientation; 
} 

Ponieważ nie można kontrolować już od dziecięcych ViewControllers ustawieniami obrotu prezentowane kontrolera widoku Musisz jakoś przechwycić co widok kontroler jest obecnie w stosie nawigacji . Tak właśnie zrobiłem :). Mam nadzieję, że pomaga!

+0

Dzięki @codeFi, twoje sugestie naprawiły moje problemy. Podczas migrowania z iOS5 do iOS6 zmagałem się z wieloma problemami związanymi z orientacją na urządzenie. Sprawiasz, że mój dzień jest lepszy! –

1

Podklasa UINavigationController i zastąpić shouldAutorotate i supportedInterfaceOrientations tak:

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

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

Teraz można kontrolować swoją orientację jest każdy ViewController. Wystarczy zastąpić dwie metody w każdym ViewController.