2012-10-04 3 views
5

Wenn ich meine App auf den iOS6-Standard aktualisiere, ist das Hochformat/Querformat nicht mehr vorhanden. Ir funktionierte perfekt, als ich mit Xcode 3 baute. Aber jetzt mit der neuesten Xcode und neuesten SDK ist die Rotation weg und es ist immer im Hochformat. Egal was ich in "Supported Interface Orientations" eingebe. Und der Code, mit dem ich vorher gedreht habe, scheint überhaupt keine Wirkung zu haben. Ich hatte diese Zeilen.Hochformat und Querformat in iOS6

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 
{ 
    switch (toInterfaceOrientation) { 
     case UIInterfaceOrientationPortrait: 
     case UIInterfaceOrientationLandscapeLeft: 
     case UIInterfaceOrientationLandscapeRight: 
      return YES; 
     default: 
      return NO; 
    } 
} 

Wie ändere ich und was ändere ich, damit es wieder funktioniert?

+0

Versuchen Sie dies. Er arbeitete für mich: http://stackoverflow.com/questions/10096672/uiwindows-root-view-controller-does-not-rotate-to-landscape-at-app-launch –

Antwort

17

Zuerst in AppDelegate, schreiben Sie dies. DIES IST SEHR IMP

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 
{ 
    return (UIInterfaceOrientationMaskAll); 
} 

Dann Für UIViewControllers, in dem Sie nur PORTRAIT Modus benötigen, schreiben Sie diese Funktionen

- (BOOL)shouldAutorotate 
{ 
    return YES; 
} 

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

Für UIViewControllers, die zu LANDSCHAFT erfordern, ändern, um alle zu maskieren.

Wenn Sie nun einige Änderungen vornehmen möchten, wenn sich die Ausrichtung ändert, verwenden Sie diese Funktion.

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 
{ 

} 

EDIT:

Viel hängt mit dem am Controller ist Ihre UIViewController in eingebetteten

zB wenn sein Innen UINavigationController, dann müssen Sie vielleicht, dass UINavigationController Unterklasse Orientierung außer Kraft zu setzen. Methoden wie diese.

Unterklasse UINavigationController (der obere Viewcontroller der Hierarchie übernimmt die Kontrolle über die Ausrichtung.) Hat es als self.window.rootViewController festgelegt.

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

Von iOS 6, ist es gegeben, dass UINavigationController seine UIViewControllers nicht zur Orientierung Unterstützung fragen. Daher müssten wir es unterklassieren.

+0

Sieht aus wie ein guter Ansatz Aber es tut mir leid zu sagen, dass es bei meinem alten Projekt nicht funktioniert, egal wie ich die Tasten eindrücke, unterstützte Schnittstellen-Orientierungen oder nicht. Und in einem neuen Projekt scheint es auch nicht zu funktionieren. Ich frage mich, was ich hier falsch mache. –

+0

Überprüfen Sie die Antwort. Eigentlich hatte auch ich ein ähnliches Problem, das behoben wurde. – mayuur

+0

Wird testen, was Sie sagen. Aber in der Zwischenzeit habe ich die Rotation dazu gebracht, diese Zeilen in delegate, self.window.rootViewController = self.navigationController; und die Drehung funktioniert entsprechend der "Knopfauswahl", aber wie man einige ViewControllers macht, um immer im Portrait zu sein, verstehe ich noch nicht –

1

Ich weiß nicht, ob Ihr Problem ähnlich war, aber bei mir war die Statusleiste korrekt ausgerichtet (Landschaft) und die UIViewController wurde porträtiert. Ich änderte folgende Zeile in der Anwendung delegieren Anwendung: didFinishLaunchingWithOptions:

//[window addSubview:navigationController.view]; 

self.window.rootViewController = navigationController; 

Apfel => Diese kostete mich einen Tag und eine Hälfte, um herauszufinden, und viel Geld !!!

6

wie ein oder mehrere Landschafts Controller in app unterstützen, das Porträt vor allem in iOS6 ist:

1) in AppDelegate

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 
    { 
     UINavigationController* ns = (UINavigationController*)self.window.rootViewController; 
     if (ns) { 
      UIViewController* vc = [ns visibleViewController]; 
//by this UIViewController that needs landscape is identified 
      if ([vc respondsToSelector:@selector(needIos6Landscape)]) 
       return [vc supportedInterfaceOrientations]; 

     } 
     return UIInterfaceOrientationMaskPortrait; //return default value 
    } 

2) in UIView Steuerung (en), die Landschaft (oder Hochformat braucht + lanscape etc.):

//flag method 
-(void)needIos6Landscape { 
} 
- (BOOL)shouldAutorotate 
{ 
    return YES; 
} 
- (NSUInteger)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskAllButUpsideDown; 
} 

3) in Steuerungen, auf die Sie von Controller zurückgeben kann, die in der Landschaft gedreht werden kann - das ist wichtig, sonst remaind sie Landschaft bei der Rückkehr von Landschaft-aktivierten VC.

- (BOOL)shouldAutorotate 
{ 
    return YES; 
} 
- (NSUInteger)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskPortrait; 
} 

4) (vielleicht nicht notwendig, aber sicher ..) - Unterklasse Navigation-Controller (n) Sie verwenden, und fügen:

- (BOOL)shouldAutorotate 
{ 
    return YES; 
} 
- (NSUInteger)supportedInterfaceOrientations 
{ 
    UIViewController* vc = [self visibleViewController]; 
    if (vc) { 
     if ([vc respondsToSelector:@selector(needIos6Landscape)]) { 
      return [vc supportedInterfaceOrientations]; 
     } 
    } 
    return UIInterfaceOrientationMaskPortrait; 
} 

Der wichtige Schritt ist nur zur Orientierung fragen Controller von Ihrer App aus, weil während des Übergangs zwischen den Controllern für einige Zeit ein Systemcontroller als root existiert und einen falschen Wert zurückgibt (dies hat mich zwei Stunden gekostet, um herauszufinden, dass es nicht funktionierte).