2012-09-24 10 views
14

Unterstützung ich diesen CodepresentViewController nicht Orientierung in iOS 6

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

Meine Anwendung hat zwei Orientierung Portrait und Portrait des Kopf verwenden. Dieser Code funktioniert gut mit iOS 5.1, aber Orientierung funktioniert nicht auf iOS 6

Ich habe diesen Code auch hinzugefügt meine navigationControllerCustom Klasse

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

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

Bitte helfen Sie mir, dieses Problem zu lösen.

Vielen Dank im Voraus.

+2

Ich habe das gleiche Problem in meinen Apps, die ich für iOS 6 kompiliert habe; Alle Orientierungen funktionieren mit Ausnahme von UIInterfaceOrientationPortraitUpsideDown; es ist komisch. – MrJre

+0

@MrJre Jede Lösung auf das gleiche wie das ist wirklich seltsam. –

Antwort

25

Sie müssen diese Delegierten in Ihre Anwendung sind:

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

auch sicherstellen, dass die View-Controller die beiden folgenden haben, funktioniert gut für mich.

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

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

Die Dokumentation sagt auch, dass UINavigationController's nicht seine Top-View-Controller nicht Abfrage für Orientierungen unterstützt, obwohl ein Apple hat so sagen auf den Entwicklerforen Ingenieur über ... es scheint, dass es nicht. Daher sollten Sie eine Kategorie für UINavigationController hinzufügen, ist dies die ich benutze:

#import "UINavigationController+autorotate.h" 

@implementation UINavigationController (autorotate) 

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

@end 

Weitere Informationen wie AutoRotate auf iOS arbeitet 6 check out this answer

+0

Perfekte Antwort, Sie haben mein Problem gelöst, Danke :-) –

+1

Die Kategorie UINavigationController war ausreichend. – Gujamin

+0

+1 Der App-Delegiertenabschnitt war sehr hilfreich. –

2

Sie haben vergessen:

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

Danke für Ihre Antwort. Ich fügte hinzu, aber es funktioniert nicht, jede andere Sache, die ich vermisse. –

+0

Haben Sie in Ihrer Info.plist unter den unterstützten Schnittstellenausrichtungen Hoch- und Querformat auf den Kopf gestellt? – rocky

+0

Ja, das habe ich auch getan, noch etwas anderes? –

1

Gerade Paste kopieren, die über Ihr Code-Snippet

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

@end 
1

Wenn Sie die Rotation für alle View-Controller aktivieren oder deaktivieren möchten, müssen Sie UINavigationController nicht von der Unterklasse trennen. Verwenden Sie stattdessen:

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

in Ihrem AppDelegate.

Falls Sie alle Orientierungen in der App aber unterschiedliche Orientierungen auf ELTERN View-Controller (UINavigationController Stack zum Beispiel) zu unterstützen, sollten Sie

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

in Kombination mit den folgenden Methoden in Ihren Eltern-View-Controller verwenden.

- (BOOL)shouldAutorotate 

und

- (NSUInteger)supportedInterfaceOrientations 

Aber wenn Sie in verschiedenen CHILDREN Viewcontrollers in dem gleichen Navigationsstapel (wie ich) unterschiedliche Ausrichtung Einstellungen haben Sie die aktuellen Viewcontroller im Navigationsstapel überprüfen müssen.

Ich habe folgendes in meiner UINavigationController Unterklasse erstellt:

- (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; 
} 

Da kann man nicht mehr von Kindern steuert Viewcontrollers der Rotationseinstellungen dargebotener View-Controller müssen Sie irgendwie abfangen, welche View-Controller ist im Navigationsstapel . Also das habe ich gemacht :). Ich hoffe, das hilft !

+0

Danke @codeFi, deine Vorschläge haben meine Probleme behoben. Ich habe ziemlich viel mit der Migration von iOS5 zu iOS6 mit den verschiedenen Problemen der Geräteausrichtung gekämpft. Du hast meinen Tag gerettet! –

1

Subclass UINavigationController und überschreiben die shouldAutorotate und supportedInterfaceOrientations wie folgt aus:

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

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

Und jetzt können Sie Ihre Orientierung steuern jedes Viewcontroller ist. Überschreiben Sie einfach die beiden Methoden in jedem ViewController.

Verwandte Themen