2010-08-04 8 views
21

In meiner iPad-App muss ich einen Layoutcode ausführen, um das richtige Layout abhängig von der Ausrichtung festzulegen. Standardmäßig ist das Layout für die Querformatausrichtung konfiguriert. Für den Fall, dass die App im Hochformat gestartet wird, muss daher zusätzliche Aktion ausgeführt werden, um die Ansichten ordnungsgemäß für die Anzeige im Hochformat zu konfigurieren. In meiner -application:didFinishLaunchingWithOptions: Methode überprüfe ich die Orientierung mit [[UIDevice currentDevice] orientation]. Das Problem hierbei ist, dass es immer Porträt zurückgibt, auch wenn die App im Querformat startet. Gibt es einen Weg dazu?Launch-Ausrichtung der iPad-App abrufen

Antwort

36

Dies ist das erwartete Verhalten. Quoth the UIViewController documentation:

Hinweis: Bei Startzeit, Anwendungen sollten immer ihre Schnittstelle in einem Hochformat einrichten. Nachdem die Methode application:didFinishLaunchingWithOptions: zurückgegeben wurde, verwendet die Anwendung den oben beschriebenen View Controller-Drehmechanismus, um die Ansichten vor dem Anzeigen des Fensters in die entsprechende Ausrichtung zu drehen.

Mit anderen Worten, bis das Gerät die Orientierung betrifft ist Porträt, während die Anwendung gestartet wird. Irgendwann nach application:didFinishLaunchingWithOptions: wird es die unterschiedliche Orientierung erkennen und rufen Sie Ihre shouldAutorotateToInterfaceOrientation: Methode und dann Ihre other view rotation methods, die Sie als normal behandeln sollten.

+0

für Batter Hilfe oder schnelles Ergebnis siehe ..... dieses http://StackOverflow.com/Questions/5888016/IOS-Device-Orientation-on-Load/32758397#32758397 – jenish

0

Sie wollen sicherstellen, dass Sie die richtigen Schlüssel in Ihrem Info.plist für die Ausrichtung zu ermöglichen, setzen Sie wollen:

UISupportedInterfaceOrientations 
    UIInterfaceOrientationPortrait 
    UIInterfaceOrientationPortraitUpsideDown 
    UIInterfaceOrientationLandscapeLeft 
    UIInterfaceOrientationLandscapeRight 
+0

Ich habe alle 4 Orientierungen in meiner PLIST-Datei. – indragie

13

Verwenden self.interfaceOrientation in Ihrem View-Controller - es ist eine Eigenschaft, die von UIViewController gesetzt iOS für Sie, und in einigen Fällen ist zuverlässiger als [[UIDevice currentDevice] orientation].

Hier ist eine detaillierte Beschreibung: http://bynomial.com/blog/?p=25

+0

Schöne Lösung, so. – Roger

+0

Es gibt drei Orientierungseigenschaften: 'UIDevice.orientation',' UIViewController.interfaceOrientation' und 'UIApplication.statusBarOrientation'. – rpetrich

+0

Einfach und gibt sehr konsistente Ergebnisse. – krsteeve

2

die Statusleiste Orientierung verwenden, anstatt sie zu erkennen.

UIInterfaceOrientation orientation = [UIApplication sharedApplication] .statusBarOrientation;

dann führen Sie die if's in der "Orientierung" aus, die Sie von oben erhalten haben.

+0

Achtung: Die InterfaceOrientation (= Statusleiste Ausrichtung) ist * nicht * identisch mit der Geräteausrichtung! Daher ist es nicht geeignet, eine Geräteerkennung zu erkennen. – auco

+2

Für alle Zwecke gibt es mir ein konsistenteres und genaueres Orientierungsergebnis als die UIDevice-Klasse und ihre Methode. – Bourne

19

Dies ist der beste Weg, um beim Start auf Orientierung zu prüfen. Zunächst wird eine neue Methode in Ihrem AppDelegate erstellen, die die Ausrichtung überprüft:

-(void)checkLaunchOrientation:(id)sender{ 

    UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;  
    BOOL isLandscape = UIDeviceOrientationIsLandscape(self.viewController.interfaceOrientation); 

    if (UIInterfaceOrientationIsLandscape(orientation) || isLandscape) { 
     //do stuff here 
    } 
} 

Am Ende von -application:didFinishLaunchingWithOptions: Lauf

 [self performSelectorOnMainThread:@selector(checkLaunchOrientation:) withObject:nil waitUntilDone:NO]; 
+1

Tolle Lösung! '[[UIDevice currentDevice] orientation]' von _inside_ '-application: didFinishLaunchingWithOptions:' hat eine unbekannte Ausrichtung zurückgegeben, aber die Überprüfung von einer Methode, die mit 'performSelectorOnMainThread: withOptions: waitUntilDone:' ausgeführt wird, funktioniert einwandfrei. –

+0

HINWEIS: Funktioniert nicht mit iOS 7. –

0

Nicht, dass Sie eine andere Antwort brauchen, aber ich dachte, sollte ich hinzufügen, dass Sie möchten fast nie [[UIDevice currentDevice] orientation] verwenden. Diese Methode gibt die Ausrichtung des Geräts zurück, die nicht unbedingt der Ausrichtung der Schnittstelle entspricht.

4

Wie in einem Blogpost oben erwähnt, gibt es eine Reihe von Makros zum Testen der Orientierung. Dieser Blogpost erwähnt jedoch UIDeviceOrientationIsPortrait. Ich mag das Folgende unten, es ist eine kleine Wendung.

if(UIInterfaceOrientationIsPortrait(self.interfaceOrientation)) 
{ 
    NSLog(@"Portrait"); 
} 
else 
{ 
    NSLog(@"Landscape"); 
} 

Eine Beobachtung, die ich gemacht habe, ist, dass Sie nicht diesen Code in einer Tabellenansicht aufrufen können, schob auf einen Navigation-Controller in der geteilten Ansicht Controller eingebettet auf. Mit anderen Worten, Sie können es nicht vom Master-View-Controller aus aufrufen. Sie müssen die "self.interfaceOrientation" durch splitviewcontroller.interfaceOrientation ersetzen, vorausgesetzt, Sie pflegen einen Verweis auf den übergeordneten Split-View-Controller.

1

Also ist die Frage über die Überprüfung der Ausrichtung beim Start. Die Antwort ist leider "Du kannst nicht".

Aber NACH Inbetriebnahme können Sie Ausrichtung die normale Art und Weise überprüfen (wie andere beschrieben haben).

Wenn hier jemand nach einer Antwort sucht, hören Sie einfach auf zu suchen, da beim Start die Orientierungsvariable nicht gesetzt ist (alle Ansichten Rahmen/Grenzen zeigen auch im Hochformat an, auch wenn sie nicht vorhanden sind).

0

Es ist nicht wahr, dass Sie die Launch-Orientierung nicht herausfinden können, es ist wahr, dass es ein Schmerz in der Rückseite ist, dies zu tun.

hier ist, was Sie tun müssen.

Ihr erster UIViewController muss eine spezielle Logik haben, um die gewünschten Informationen zu erhalten.
Vielleicht möchten Sie sogar einen UIStartupController nur für diese Zwecke erstellen, wenn dies für Ihren Ablauf wichtig ist.
Bei meinem Projekt hatten wir bereits einen solchen Startup Controller vorhanden.

alles, was Sie ist der folgende Code benötigen

-(id) initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
    self.launchOrientation = UIDeviceOrientationUnknown; 
    } 
    return self; 
} 

-(void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 
           duration:(NSTimeInterval)duration 
{ 
    [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration]; 

    if (self.launchOrientation == UIDeviceOrientationUnknown && duration > 0) 
    self.launchOrientation = UIInterfaceOrientationPortrait; 
    else 
    self.launchOrientation = toInterfaceOrientation; 
} 

im Grunde, wenn wir nicht in UIInterfaceOrientationPortrait starten, die erste Drehcallback-Sequenz wird zeigen tatsächlich die Einführung Orientierung.
Wenn in UIInterfaceOrientationPortrait gestartet, dann müssen wir überprüfen, dass die Dauer der ersten Rotation nicht Null ist, und dann wissen wir, dass es aus dem Hochformat gestartet wurde.