Wie programmiere ich die Orientierung der iPhone-Oberfläche?

Die möglichen Werte für UIDevice.orientation sind UIDeviceOrientationFaceUp und UIDeviceOrientationFaceDown . Während es nützlich sein kann zu wissen, dass das Gerät flach ist, sagt uns das nicht, ob es eine Oberfläche zeigt, die im Hoch- oder Querformat ausgerichtet ist. Gibt es eine Möglichkeit, die aktuelle Ausrichtung der GUI zu finden, wenn das Gerät mehrdeutige Informationen zurückgibt? Ich nehme an, dass ich Orientierungsänderungsereignisse verfolgen kann, um mich an die letzte Hoch- / Querformatausrichtung zu erinnern, oder um die Höhe und Breite der UIView-Grenzen zu überprüfen, aber das scheint klugdy zu sein. Gibt es eine Eigenschaft auf dem Gerät oder UIView, die ich vermisse?

   

In einem Viewcontroller können Sie einfach den Code verwenden:

 UIInterfaceOrientation interfaceOrientation = self.interfaceOrientation; 

Die UIInterfaceOrientation ist eine Enum:

 typedef enum { UIInterfaceOrientationPortrait = UIDeviceOrientationPortrait, UIInterfaceOrientationPortraitUpsideDown = UIDeviceOrientationPortraitUpsideDown, UIInterfaceOrientationLandscapeLeft = UIDeviceOrientationLandscapeLeft, UIInterfaceOrientationLandscapeRight = UIDeviceOrientationLandscapeRight } UIInterfaceOrientation; 

Sie können sich auf 3 Arten orientieren:

  1. UIInterfaceOrientation orientation = self.interfaceOrientation; Gibt UIInterfaceOrientation, aktuelle Ausrichtung der Schnittstelle zurück. Es ist eine Eigenschaft in UIViewController, auf die Sie nur in UIViewController-classn zugreifen können .

  2. UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; Gibt UIInterfaceOrientation, die aktuelle Ausrichtung der Statusleiste der Anwendung zurück. Sie können auf diese Eigenschaft an jedem Punkt Ihrer Anwendung zugreifen. Meine Erfahrung zeigt, dass dies der effektivste Weg ist , um echte Schnittstellenorientierung zu erhalten.

  3. UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation]; Gibt UIDeviceOrientation , Geräteausrichtung zurück. Sie können auf diese Eigenschaft an jedem Punkt Ihrer Anwendung zugreifen. Beachten Sie jedoch, dass UIDeviceOrientation nicht immer UIInterfaceOrientation ist. Wenn sich Ihr Gerät beispielsweise in einer normalen Tabelle befindet, können Sie einen unerwarteten Wert erhalten.

Wenn Sie nur darauf achten, dass das Gerät im Querformat oder im Hochformat angezeigt wird, gibt es einige praktische Methoden auf dem Viewcontroller:

 UIDeviceOrientationIsLandscape(self.interfaceOrientation) UIDeviceOrientationIsPortrait(self.interfaceOrientation) 

Die Statusleistenausrichtung (statusBarOrientation) gibt immer die Schnittstellenausrichtung zurück, selbst wenn die Statusleiste ausgeblendet ist.

Sie können die Ausrichtung der Statusleiste ohne View Controller verwenden. Es gibt Ihnen die aktuelle Ansichtsausrichtung, nicht die Geräteausrichtung.

 UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; 

Ich habe die gleiche Situation gesehen. Speziell in diesem Fluss:

  • Controller 1 lädt in etwa .. Portrait.
  • Drücken Sie einen anderen Controller auf den Stapel
  • Drehen Sie im 2. Controller die Geräteausrichtung auf Querformat.
  • Legen Sie das Gerät flach auf einen Tisch und kehren Sie dann zum ursprünglichen Controller zurück.

Zu diesem Zeitpunkt geben alle von mir gesehenen Ausrichtungsprüfungen eine ungültige Ausrichtung von 5 zurück, sodass nicht direkt festgestellt werden kann, ob ein Querformat- oder Hochformat-Layout verwendet werden sollte. (Ich mache eine benutzerdefinierte Layout-Positionierung pro Orientierung, das sind also wichtige Informationen)

In meinem Fall wird eine Überprüfung der Begrenzungsbreite der Ansicht verwendet, um den wahren Zustand der Dinge zu bestimmen, aber ich würde gerne wissen, ob andere anders angesprochen haben.

Hier ist ein Code-Tipp, den Sie vielleicht nützlich finden:

 UIInterfaceOrientation orientation = [UIDevice currentDevice].orientation; NSLog( @" ORIENTATION: %@", UIInterfaceOrientationIsLandscape( orientation ) ? @"LANDSCAPE" : @"PORTRAIT");