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!
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]
?
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
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.
UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
if ((orientation == UIInterfaceOrientationLandscapeLeft)
|| (orientation == UIInterfaceOrientationLandscapeRight) )
{
//Landscape
}
else
{
//Portrait
}
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:
UIViewController
, die dazu führt, dass die Statusleiste als Querformat angezeigt wird.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).supportedInterfaceOrientations
zurückgegeben wird. Nehmen wir an, wir unterstützen sowohl die linke als auch die rechte Landschaft mit UIInterfaceOrientationMaskLandscape
.UIDeviceOrientation
des Geräts für geeignet hält.UIInterfaceOrientation
basierend auf UIDeviceOrientation
nicht zuverlässig erraten und müssen dies auch nicht.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;
-(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.
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.
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!.
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)
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).