Wie kann ich programmgesteuert Gerät Orientierung in iOS 7?
Arbeite ich an einer iPad-app, mit AutoLayout, wo, wenn der Benutzer einen bestimmten Modus ("heads-up" - Modus), ich will nur Unterstützung für portrait (oder Porträt-upside-down -) Orientierung, und außerdem, wenn das Gerät im Querformat, würde ich gerne wechseln automatisch in den portrait-Modus.
In der top-view-controller, ich habe Folgendes:
- (NSUInteger) supportedInterfaceOrientations {
if (self.modeHeadsUp) {
return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown;
} else {
return UIInterfaceOrientationMaskAll;
}
}
- (BOOL) shouldAutorotate {
return TRUE;
}
Basieren auf den Antworten habe ich an anderer Stelle gesehen hier, die Antwort scheint zu werden, die ich verwenden soll "Anwendung setStatusBarOrientation". Also in der Methode, wo der Benutzer ausgewählt hat "heads-up" - Modus habe ich enthalten:
UIApplication *application = [UIApplication sharedApplication];
[application setStatusBarOrientation:UIInterfaceOrientationPortrait
animated:YES];
Jedoch, das einfach nicht scheinen, nichts zu tun. Ich kann zwar körperlich bewegen Sie das Gerät, um es zu drehen in den portrait -, ist es nicht automatisch tun.
In der Tat, wenn im landscape-Modus nach der Ausführung der oben genannten code, um programmgesteuert versuchen, setzen der Orientierung, wenn ich die Abfrage für die Anwendung "statusBarOrientation" mit dem folgenden code, es bleibt bei "4" für die Landschaft:
UIApplication *application = [UIApplication sharedApplication];
int orientation = [application statusBarOrientation];
self.movesTextView.text = [NSString stringWithFormat:@"ORIENTATION %d", orientation];
Schien es wie vielleicht autolayout war nicht ausgelöst wird, mit der setStatusBarOrientation, so dass ich versuchte, fügen Sie diesen code nach, gar keine Wirkung:
[super updateViewConstraints];
[self.view updateConstraints];
Erkenne ich Apple verlassen will, Gerät Orientierung in den Händen der Benutzer. Aber ich möchte in der Lage, zur Unterstützung von landscape-Modus, wenn nicht im "heads-up" - Modus.
Bin ich etwas fehlt, um in der Lage sein, um die Orientierung der Kräfte ändern?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für iOS 7 & 8:
Objective-C:
Swift 3+:
Ich nenne es in
- viewDidAppear:
.Verwenden Sie diese. Perfekte Lösung für die Ausrichtung problem..ios7 und früher
Müssen Sie rufen Sie
attemptRotationToDeviceOrientation (UIViewController)
, um das system rufen Sie IhrensupportedInterfaceOrientations
wenn die Bedingung geändert hat.UIViewController
's Orientierungfunktioniert, sondern Sie sind zur Rückgabe shouldAutorotate mit JA, in deinem view-controller
Aber wenn Sie das tun, Ihre VC Anz. autom., wenn der Benutzer das Gerät dreht...
also habe ich es geändert:
und ich rufe
Kraft, eine neue Orientierung mit einem button-Klick.
Zum set zurück shouldAutoRotate NEIN, ich Hinzugefügt, um meine rootVC
PS: Diese Problemumgehung funktioniert in allen Simulatoren auch.
Dies funktioniert für mich auf
Xcode
6 & 5.Nur so, dass für mich gearbeitet wird präsentiert dummy-modal-view-controller.
Ihre VC gebeten werden, aktualisiert Ausrichtungen beim modal-view-controller geschlossen wird.
Merkwürdige ist, dass UINavigationController tut genau dies, wenn er/Sie knallen child-view-Controller mit verschiedenen unterstützt Ausrichtungen (getestet auf iOS 6.1, 7.0).
Wenn Sie eine UIViewController, der bleiben soll im Portrait-Modus, fügen Sie einfach diese überschreiben und Sie sind alle gesetzt.
Der beste Teil ist, gibt es keine animation, wenn diese Ansicht gezeigt, es ist einfach schon in die richtige Ausrichtung.
Dieser Lösung können Sie erzwingen, dass eine bestimmte Schnittstelle von Orientierung, indem Sie vorübergehend überschreiben Sie den Wert von
UIDevice.current.orientation
und dann fragt das system zu drehen, der die Schnittstelle mit der Vorrichtung die Drehung:Wichtig: Dies ist ein hack, und könnte aufhören zu arbeiten, in jedem moment
Fügen Sie den folgenden in Ihre app root-view-controller:
Stellen Sie sicher, dass alle Ausrichtungen geprüft werden unter "Bereitstellung von Informationen":
Anfrage-Schnittstelle die Orientierung ändert, wo Sie Sie brauchen:
Wenn Sie wollen, sperren Sie die Hauptansicht der app zu portrait, wollen aber popup öffnen sichten in die Landschaft, und Sie sind mit tabBarController als rootViewController wie ich bin, können Sie diesen code verwenden auf Ihrem AppDelegate.
AppDelegate.h
AppDelegate.m
Funktioniert es sehr gut.
In Ihrem viewController Sie werden wollen, präsentiert im Querformat, verwenden Sie einfach die folgende:
UINavigationController
oderUITabBarController
integriert werden, so dass vielleicht ein wenig Unterschied, sonst.Fügen Sie diese Anweisung in
AppDelegate.h
Notieren Sie sich diesen code-Abschnitt, der in
AppDelegate.m
Ändern Sie die
allowRotation
Eigentum der Delegierten appBasis UINavigationController sollten die unten Rückruf so, dass die untergeordneten Elemente können entscheiden, welche Orientierung Sie wollen.
Wenn Sie wollen nur den portrait-Modus in iOS 9 (Xcode 7) können Sie:
War ich in ein ähnliches problem als Sie. Ich brauche zum sperren der Geräteausrichtung für einige Bildschirme (wie Login) und ermöglichen die rotation in die andere.
Nach ein paar änderungen und folgenden einige Antworten unten hab ich es durch:
shouldAutorotate
Methode in diesem VC:-(BOOL)shouldAutorotate{
return NO;
}
Hoffe, dies wird für Sie arbeiten.
hier ist es ein VOLL funktionsfähiges Beispiel für iOS 7, 8, 9, 10, wie ändern app Orientierung zu seinem aktuellen gegenüber
Objective-C
Swift 3
"orientation"
ist nicht gut.UIDevice
'sorientation
Eigenschaft ist bereit-nur. Haben Sie angesichts der Ablehnung der app für dieser code überhaupt?Versuchen Sie, diese zusammen mit Ihrem code.
wenn der Benutzer eine beliebige option, die dann diese Methode aufrufen, weil Benutzer kann im landscape-Modus und dann kann er nur portrait-Modus in derselben view-controller automatisch anzeigen, sollte verschoben werden, um portrait-Modus, also in die Schaltfläche acton nennen diese
[self willRotateToInterfaceOrientation:UIInterfaceOrientationPortrait duration:ROTATE_VIEW_DELAY];
zu der Methode, bei der die heads-up-Modus ausgewählt ist, ersetzt Sunny Shah objc_msgSend Antwort oben. Leider immer noch keine Auswirkungen auf die Anzeige. Es ist mein Verständnis, dass "willrotate" wird aufgerufen, wenn die Anzeige zu drehen, in Reaktion auf den Benutzer körperlich bewegen Gerät.@property (nonatomic) bool modePortraitOnly;
- (NSUInteger) supportedInterfaceOrientations { if (self.modePortraitOnly) { return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown; } else { return UIInterfaceOrientationMaskAll; } }
und wenn die Kontrolle von änderungen, habe ich einfach ` [self willRotateToInterfaceOrientation:UIInterfaceOrientationPortrait Dauer:1.0];", aber wie Sie sehen können, wenn Sie versuchen es, es bringt nichts. Kommentieren Sie diese Zeile und fügen Sie Sunny shah ist oben und es funktioniert.Dieser arbeitete mich perfekt....
Für diejenigen, die wie ich gekämpft, um zu bekommen @Sunny Schah akzeptierte Antwort auf arbeiten auf iPads. Sie müssen die "Erfordert full screen" Kontrollkästchen in der Projekt-Einstellungen. Beachten Sie, dass dies wird verhindern, dass Ihre app von der multitasking-Modus, die kann oder kann nicht akzeptabel sein.