Programmierbare Schnittstelle, die die Orientierung ändern funktioniert nicht für iOS
So, ich habe ein Projekt, wo ich brauche, um Kraft, Orientierung ändern, wenn ein Benutzer eine Taste drückt. Ich habe eine Beispiel-app auf github das Problem veranschaulichen.
@interface DefaultViewController () {
UIInterfaceOrientation _preferredOrientation;
}
Einige rotation Umgang mit bits
- (BOOL)shouldAutorotate {
return YES;
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
return _preferredOrientation;
}
Und ein Knebel
- (IBAction)toggleButtonPressed:(id)sender {
_preferredOrientation = UIInterfaceOrientationIsPortrait(_preferredOrientation)
? UIInterfaceOrientationLandscapeRight
: UIInterfaceOrientationPortrait;
[self forceOrientationChange];
}
- (void)forceOrientationChange
{
UIViewController *vc = [[UIViewController alloc] init];
[self presentViewController:vc animated:NO completion:nil];
[UIView animateWithDuration:.3 animations:^{
[vc dismissViewControllerAnimated:NO completion:nil];
} completion:nil];
}
Also, das scheint gut zu funktionieren, wenn Sie drücken Sie einfach die Schaltfläche Umschalten, es ändert sich die Ausrichtung wie erwartet. Aber wenn ich beginne, die tatsächliche Ausrichtung des Geräts, gibt es ein Problem.
Schritte zum reproduzieren des Problems:
- Öffnen Sie die app im hochformat
- Drücken Sie die Taste, um zu erzwingen die änderung der Ausrichtung landscape (Halten Sie das Gerät im hochformat)
- Drücken Sie die Taste erneut, um die Kraft der Drehung zurück auf hochformat (Noch halten Sie das Gerät im hochformat)
- Drehen Sie die tatsächlichen Gerät, um Landschaft, ohne drücken der Taste
Das Ergebnis ist, dass die Ansicht nicht drehen, um die Landschaft, aber der status Balken wird.
Jede Hilfe wäre sehr geschätzt werden!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Konnte ich dieses Problem beheben, indem Sie die folgende Zeile hinzufügen, bevor Sie die Vorlage und schließen des view-controller:
Es ist schwer, genau zu sagen, warum dies funktioniert. Dieser Aufruf fragt, versucht, die
interfaceOrientation
zudeviceOrientation
durch den AufrufshouldAutorotateToInterfaceOrientation:
und die anschließende Drehung Methoden, wennYES
zurückgegeben.Es scheint, das interface und die Geräte-Ausrichtungen wurden, stecken synchron durch die Problemumgehung erforderlich, zu zwingen, eine interface-Orientierung trotz der Geräteausrichtung. Dennoch sollte nicht passieren, aber in meiner Meinung, als die Problemumgehung ist immer noch eine legitime Nutzung der zur Verfügung gestellten Methoden. Es könnte ein bug in Apple ' s rotation/Orientierung stack.
Complete-Methode:
Wenn wir reden über die Orientierung, Sie sind 2 Dinge, die kommen ins Bild:
Geräteausrichtung
Interface-Orientierung
Ihre klare, von der nur dem Namen nach, Gerät Orientierung erzählt, in der Ausrichtung Gerät und Interface-Orientierung sagt, in der Ausrichtung Ihrer app präsentiert seine Schnittstelle.
Hier, was Sie tun, ist, Ihre app unterstützt alle Orientierung. Sie müssen beim check markiert alle Ausrichtungen im Projekt.
Nun, wenn Sie ändern die Ausrichtung des Geräts von hochformat zu Querformat, wenn Sie festgelegt haben interfaceOrientation werden im portrait-Modus programmatisch, dies ist, was passiert. Wie die Lage des Gerätes verändert, Orientierung in der Statusleiste ändert sich auch. Aber wie haben Sie beschränkt interface Ihrer app im hochformat, es ist nicht der änderung seiner Orientierung..
Also das ist, was Sie tun können:
Verwenden Sie diesen code: