96 Stimmen

Gibt es eine dokumentierte Möglichkeit, die Ausrichtung des iPhone einzustellen?

Ich habe eine App, bei der ich die Gerätedrehung in bestimmten Ansichten unterstützen möchte, aber andere sind im Querformat nicht besonders sinnvoll, so dass ich, wenn ich die Ansichten auswechsle, die Drehung erzwingen möchte, um auf Hochformat eingestellt zu werden.

Es gibt eine undokumentierte Eigenschaft setter auf UIDevice, die den Trick tut, aber offensichtlich erzeugt eine Compiler-Warnung und könnte mit einer zukünftigen Revision des SDK verschwinden.

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationPortrait];

Gibt es dokumentierte Möglichkeiten, die Ausrichtung zu erzwingen?

更新しました。 Ich dachte, ich würde ein Beispiel bereitstellen, da ich nicht auf der Suche nach shouldAutorotateToInterfaceOrientation bin, da ich das bereits implementiert habe.

Ich möchte, dass meine App das Quer- und Hochformat in Ansicht 1 unterstützt, aber nur das Hochformat in Ansicht 2. Ich habe bereits shouldAutorotateToInterfaceOrientation für alle Ansichten implementiert, aber wenn der Benutzer im Querformat in Ansicht 1 ist und dann zu Ansicht 2 wechselt, möchte ich das Telefon zwingen, sich wieder ins Hochformat zu drehen.

101voto

Josh Punkte 1019

Dies ist zwar lange her, aber nur für den Fall, dass jemand auftaucht, der keinen Navigationscontroller verwendet und/oder keine undokumentierten Methoden verwenden möchte:

UIViewController *c = [[UIViewController alloc]init];
[self presentModalViewController:c animated:NO];
[self dismissModalViewControllerAnimated:NO];
[c release];

Es reicht aus, einen Vanilla-View-Controller zu präsentieren und zu beenden.

Natürlich müssen Sie immer noch die Ausrichtung in Ihrem Override von shouldAutorotateToInterfaceOrientation bestätigen oder verweigern. Dies wird jedoch dazu führen, dass shouldAutorotate... erneut vom System aufgerufen wird.

16voto

Michael Gaylord Punkte 7122

Wenn Sie das Drehen vom Hoch- ins Querformat erzwingen wollen, finden Sie hier den Code. Beachten Sie nur, dass Sie die Mitte der Ansicht anpassen müssen. Mir ist aufgefallen, dass ich die Ansicht nicht an der richtigen Stelle platziert habe. Ansonsten hat es perfekt funktioniert. Vielen Dank für den Tipp.

if(UIInterfaceOrientationIsLandscape(self.interfaceOrientation)){

        [UIView beginAnimations:@"View Flip" context:nil];
        [UIView setAnimationDuration:0.5f];
        [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

        self.view.transform = CGAffineTransformIdentity;
        self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(90));
        self.view.bounds = CGRectMake(0.0f, 0.0f, 480.0f, 320.0f);
        self.view.center = CGPointMake(160.0f, 240.0f);

        [UIView commitAnimations];
}

16voto

Bdebeez Punkte 3494

Soweit ich das beurteilen kann, ist die setOrientation: Methode funktioniert nicht (oder vielleicht nicht mehr). Hier ist, was ich tue, um dies zu tun:

Zuerst fügen Sie dieses Define an den Anfang Ihrer Datei, direkt unter #imports:

#define degreesToRadian(x) (M_PI * (x) / 180.0)

dann, in der viewWillAppear: Methode

[[UIApplication sharedApplication] setStatusBarHidden:YES animated:NO];     
if (self.interfaceOrientation == UIInterfaceOrientationPortrait) {  
    self.view.transform = CGAffineTransformIdentity;
    self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(90));
    self.view.bounds = CGRectMake(0.0, 0.0, 480, 320);
}

Wenn Sie möchten, dass das Ganze animiert wird, können Sie es in einen Animationsblock einpacken, etwa so:

[UIView beginAnimations:@"View Flip" context:nil];
[UIView setAnimationDuration:1.25];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

[[UIApplication sharedApplication] setStatusBarHidden:YES animated:NO];     
if (self.interfaceOrientation == UIInterfaceOrientationPortrait) {  
    self.view.transform = CGAffineTransformIdentity;
    self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(90));
    self.view.bounds = CGRectMake(0.0, 0.0, 480, 320);
}
[UIView commitAnimations];

Dann können Sie in Ihrem Hochformat-Controller den umgekehrten Weg gehen - prüfen Sie, ob es sich um ein Querformat handelt, und wenn ja, drehen Sie es zurück ins Hochformat.

7voto

Rafael Nobre Punkte 5000

Ich habe gegraben und gegraben auf der Suche nach einer guten Lösung für dieses Problem. Ich habe diesen Blog-Beitrag gefunden, der das Problem löst: Entfernen Sie Ihre äußerste Ansicht aus dem Schlüssel UIWindow und fügen Sie es erneut hinzu, dann fragt das System erneut die shouldAutorotateToInterfaceOrientation: Methoden von Ihren Viewcontrollern, die die korrekte Ausrichtung erzwingen, angewendet werden. Sehen Sie es: iphone zwingt uiview zur Neuausrichtung

7voto

Andrew Vilcsak Punkte 3389

Ich hatte ein Problem, bei dem ich eine UIViewController auf dem Bildschirm, in einer UINavigationController im Querformat. Wenn der nächste View-Controller in den Fluss geschoben wird, brauchte ich jedoch das Gerät in die Hochformatausrichtung zurückzukehren.

Was mir auffiel, war, dass die shouldAutorotateToInterfaceOrientation: Methode wird nicht aufgerufen, wenn ein neuer View Controller auf den Stack geschoben wird, sondern er wird aufgerufen, wenn ein View Controller aus dem Stack gepoppt wird .

Ich nutze diesen Vorteil und verwende diesen Codeschnipsel in einer meiner Anwendungen:

- (void)selectHostingAtIndex:(int)hostingIndex {

    self.transitioning = YES;

    UIViewController *garbageController = [[[UIViewController alloc] init] autorelease];
    [self.navigationController pushViewController:garbageController animated:NO];
    [self.navigationController popViewControllerAnimated:NO];

    BBHostingController *hostingController = [[BBHostingController alloc] init];
    hostingController.hosting = [self.hostings objectAtIndex:hostingIndex];
    [self.navigationController pushViewController:hostingController animated:YES];
    [hostingController release];

    self.transitioning = NO;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    if (self.transitioning)
        return (toInterfaceOrientation == UIInterfaceOrientationPortrait);
    else
        return YES;
}

Indem man einen leeren View-Controller erstellt, ihn auf den Stapel schiebt und sofort wieder entfernt, kann man die Oberfläche in die Hochformat-Position zurückbringen. Sobald der Controller verschoben wurde, schiebe ich einfach den Controller auf, den ich von vornherein verschieben wollte. Optisch sieht das großartig aus - der leere, beliebige View-Controller ist für den Benutzer nie zu sehen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X