wake-up-neo.net

Bestimmen Sie UIInterfaceOrientation auf dem iPad

In diesem Fall muss ich die Ausrichtung nicht angeben, ich muss sie nur erkennen, aber ich habe Probleme. Ich habe bedingten Code, der nur im Hochformat funktionieren sollte. Wenn sich das Gerät im Querformat befindet, muss ich etwas anderes tun. Da die deviceOrientation nicht unbedingt mit der interfaceOrientation identisch ist, kann ich keine Möglichkeit finden, den Portrait-Modus zu testen.

Die meisten Tutorials, die ich bei Google finde, sind Möglichkeiten, Landschaft zu erzwingen oder eine Art Rotation durchzuführen. Das einzige, was ich tun möchte, ist nur die Orientierung zu bestimmen. Hier ist mein Code, der nicht funktioniert:

-(void)viewDidLoad {
    [super viewDidLoad];
    //currentOrientation is declared as UIInterfaceOrientation currentOrientation
    currentOrientation = [[UIApplication sharedApplication] statusBarOrientation];
NSLog(@"%@",currentOrientation);  // == NULL
}

Ich muss den Wert von interfaceOrientation und Programm bedingt bestimmen. Danke für Ihre Hilfe!

34
Justin

Kennen Sie die interfaceOrientation-Eigenschaft der UIViewController-Klasse?

- (void) viewDidLoad {
    [super viewDidLoad];
    BOOL isPortrait = UIDeviceOrientationIsPortrait(self.interfaceOrientation);
    // now do whatever you need
}

Oder sind Sie nach [[UIDevice currentDevice] orientation] ?

78
zoul

Insbesondere beim Start habe ich festgestellt, dass die folgenden Punkte für die Benutzeroberfläche immer genau sind, unabhängig von der Ausrichtung des UIDevice.

[UIApplication sharedApplication].statusBarOrientation
39
slycrel

self.interfaceOrientation ist in bestimmten Situationen unzuverlässig. Wenn Sie beispielsweise Registerkarten in einer Anwendung mit Registerkarten neu anordnen, wird ein falscher Wert zurückgegeben.

[UIApplication sharedApplication].statusBarOrientation ist jedoch immer zuverlässig. Sie haben mir viel Zeit erspart. Vielen Dank.

10
Devang Vyas
UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;

if ((orientation == UIInterfaceOrientationLandscapeLeft)
||  (orientation == UIInterfaceOrientationLandscapeRight) )
{
    //Landscape
}
else
{
    //Portrait
}
4
Akshay Dhavale

Ich habe die Antwort bereits von @slycrel gestimmt, aber ich würde mir gerne die Zeit nehmen, dies zu schreiben, und einige Dinge aufzeigen, die in dieser alten Frage verloren zu sein scheinen, und viele andere Fragen zu diesem Thema.

Es ist wahr, dass Apple nicht wirklich möchte, dass wir die meisten unserer Benutzeroberflächen basierend auf Orientierungsänderungen aktualisieren, aber es ist immer noch völlig möglich und manchmal von Fall zu Fall erforderlich. Dies wird auch so sein, bis Apple ihre neuen Eigenschaften verbessert. APIs (zB viewWillTransitionToFrame: wäre viel nützlicher als viewWillTransitionToSize:. Sagen Sie einfach)

Warum ich die Antwort von @slycrel aufgegeben habe, hängt damit zusammen, was Sie als logischen Unterschied zwischen UIDeviceOrientation und UIInterfaceOrientation beachten müssen.

Die Statusleiste kennzeichnet die aktuell bekannte UIInterfaceOrientation-Anwendung. All diese Informationen zu FaceUp, FaceDown beziehen sich nur auf die Ausrichtung eines Geräts und nicht unbedingt auf die Anwendung Ihrer Anwendung. Eine Anwendung unterstützt ohnehin keine Geräteorientierung. In der Tat kann UIDeviceOrientation vollständig ignoriert werden, wenn Sie lediglich dafür sorgen müssen, dass Sie das Layout und die Animation der Dinge in Ihrer Benutzeroberfläche ordnungsgemäß vornehmen. Dies sind 99% der Anwendungsfälle eines Anwendungsentwicklers. Dies wird derzeit mit der UIInterfaceOrientation von @ slycrel der Statusleiste erreicht: 

[UIApplication sharedApplication].statusBarOrientation

Es sei darauf hingewiesen, dass die Version readwrite dieser Eigenschaft nicht mehr empfohlen wird, die Version readonly jedoch nicht.

Nehmen Sie dieses Beispiel:

  • Ich habe eine Anwendung, die ALLE Schnittstellenausrichtungen unterstützt, und einen Root-View-Controller, der sie ebenfalls unterstützt.
  • Jetzt präsentiere ich eine UIViewController, die dazu führt, dass die Statusleiste als Querformat angezeigt wird.
  • Für welche Querformat-Ausrichtung (links oder rechts) es sich bezieht, hängt davon ab, was von preferredInterfaceOrientationForPresentation für diesen Ansichts-Controller zurückgegeben wird, welche Geräteausrichtung aktuell ist und welche Schnittstellenausrichtungen der Ansichts-Controller unterstützt (siehe nächster Punkt).
  • Die Statusleiste wechselt unabhängig von der aktuellen Ausrichtung des Geräts zum Querformat, da dieser Ansichtscontroller nur das Querformat unterstützt, das auf dem basiert, was von supportedInterfaceOrientations zurückgegeben wird. Nehmen wir an, wir unterstützen sowohl die linke als auch die rechte Landschaft mit UIInterfaceOrientationMaskLandscape.
  • Ich möchte auch diesen View-Controller mit einer Rotationstransformation in Position animieren. Dies ist nur erforderlich, wenn Sie vom Hoch- oder Querformat zum Querformat oder Querformat wechseln. Ansonsten handelt es sich um eine einfachere Präsentationsanimation ohne Rotation.
  • Dann, nach einiger Zeit und Verwendung des Geräts, lehne ich diesen View-Controller ab.
  • Jetzt möchte ich diesen View-Controller mit einer anderen Rotationstransformation vom Bildschirm aus animieren. Dies ist nur erforderlich, wenn Sie von links nach rechts oder quer über Querformat zu Kopf oder Hochformat wechseln. Andernfalls handelt es sich um eine einfachere Kündigungsanimation ohne Drehung.
  • An dieser Stelle wird die Ausrichtung der Statusleiste so gewählt, wie es das System für die Kombination der bevorzugten Schnittstellenorientierung Ihres Root View Controllers und der unterstützten Schnittstellenorientierungen sowie der aktuellen UIDeviceOrientation des Geräts für geeignet hält.
  • Da der View-Controller ALLE Schnittstellenausrichtungen unterstützt, können Sie bei der Ausrichtung Ihres Geräts FaceUp oder FaceDown die nächste UIInterfaceOrientation basierend auf UIDeviceOrientation nicht zuverlässig erraten und müssen dies auch nicht.
  • Also ... Statusleiste zur Rettung!

Das vorige Beispiel ist möglich, da die Ausrichtung der Statusleiste nicht aktualisiert wird, wenn ein View-Controller-Übergang gerade beginnt (das System bittet einen Übergangsdelegierten um einen Animator usw.). Dann wird es aktualisiert, wenn der Übergang animiert wird (z. B. zu dem Zeitpunkt, zu dem animationTransition: aufgerufen wird). Auf diese Weise sollten Sie einen guten Vergleich nur mit den Anfangs- und aktuellen Werten der UIInterfaceOrientation der Statusleiste haben.

Auch ohne View Controller-Übergänge sollte es sicher sein, Ansichten basierend auf der Ausrichtung der Statusleiste zu aktualisieren.

Beachten Sie. Wenn Sie die Statusleiste manuell aktualisieren und "Info zur Anzeige der Controller-Statusleiste" in Ihrer Info.plist nicht verwenden, muss die Logik Ihrer Anwendung wissen, wann die Statusleiste angezeigt wird und hat die Orientierung geändert. Sie werden wahrscheinlich nach ein paar NSNotification-Namen für diese Fälle suchen, nämlich:

  • UIApplicationWillChangeStatusBarOrientationNotification
  • UIApplicationDidChangeStatusBarOrientationNotification

Sowie diese UIApplicationDelegate Methoden:

- (void)application:(UIApplication *)application willChangeStatusBarOrientation:(UIInterfaceOrientation)newStatusBarOrientation duration:(NSTimeInterval)duration;
- (void)application:(UIApplication *)application didChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation;
- (UIInterfaceOrientationMask)supportedInterfaceOrientationsForWindow:(nullable UIWindow *)window

Und diese andere hilfreiche UIApplication-Eigenschaft:

@property(nonatomic,readonly) NSTimeInterval statusBarOrientationAnimationDuration;
1
drkibitz
-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{</br>
   if (UIDeviceOrientationIsLandscape(toInterfaceOrientation)) {</br>
        some instructions;
   } else { 
        some instructions;
   }
}

Dies ist ein Ausschnitt aus einem meiner Programme ... Sie können natürlich auch die if -Anweisung in Ihrer ViewDidLoad-Benachrichtigung verwenden.

1
crash

Mische es ein wenig:

BOOL isLandscape = self.view.frame.size.width > self.view.frame.size.height;

(Bearbeiten) Offensichtlich sind die vorherigen Antworten der richtige Weg, dies zu tun, und diese Lösung schlägt fehl, wenn View-Controller nicht im Vollbildmodus angezeigt werden.

1
Adam Eisfeld

Ich weiß, dass es ein sehr alter Beitrag ist. Wie auch immer, ich möchte einen Punkt hinzufügen, der besagt, dass es besser ist, die Ausrichtung der Statusleiste zu überprüfen. Wann immer Sie self.interfaceorientation aufrufen, ruft es jedes Mal shouldRotateToOrientation auf. Wenn Sie Code in diese Methode geschrieben haben, wird dieser ausgeführt. Seien Sie also vorsichtig!.

1
Vignesh
    UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;
    UIInterfaceOrientation statusBarOrientation = [UIApplication sharedApplication].statusBarOrientation; 

    if(deviceOrientation == UIDeviceOrientationFaceUp || deviceOrientation == UIDeviceOrientationFaceDown){
        if(debug){
            NSLog(@"Nothing to change because it is gone to Flat");
        }
        return;
    }
    if(deviceOrientation !=statusBarOrientation){
        if(debug){
            NSLog(@"\nApple has a bug?:\n UIDeviceOrientation : %d, UIInterfaceOrientation: %d",deviceOrientation, statusBarOrientation  );
        }
    }

Sie werden mir nicht glauben, bis Sie an der Konsole die zweite Ausgabe sehen! Einige Situationen - und sie existieren! - wird der letzte NSLog-Inhalt angezeigt!

Dann müssen Sie einige Workarounds durchführen, um auf diesem Weg weiterzugehen, wo iOS keinen Fehler hat. Viel Glück für alle!

Ah das ... Forum-Moderator wird vielleicht auch diesen Beitrag löschen, da dies nicht seiner Meinung nach sein und antworten sollte!

Ich hoffe es hilft jemandem einmal, es passiert auch auf dem iPhone ... (da hab ich)

1
user529543

Seit iOS8 wurden APIs nicht mehr unterstützt oder liefern nicht hilfreiche Ergebnisse wie .FaceUp.FaceDown.

Dies liegt daran, dass Apple Ihre Benutzeroberfläche NICHT mithilfe der Ausrichtung aktualisieren möchte, sondern mithilfe von Größenklassen, Einschränkungen und Proportionen (mit n% des Superview).

Orientierungsabhängiger Code liefert möglicherweise keine guten Ergebnisse für den gesamten Geräte- und Anwendungsbereich (insbesondere Multitasking).

0
Antzi