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.

1voto

David van Dugteren Punkte 3556

Am Ende habe ich das Problem ganz einfach gelöst. Ich habe alle oben genannten Vorschläge ausprobiert und bin immer noch nicht fündig geworden, also war dies meine Lösung:

In der ViewController, die Querformat (links oder rechts) bleiben muss, höre ich für die Ausrichtung Änderungen:

    [[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(didRotate:)
                                             name:UIDeviceOrientationDidChangeNotification object:nil];

Dann in didRotate:

- (void) didRotate:(NSNotification *)notification
{   if (orientationa == UIDeviceOrientationPortrait) 
    {
        if (hasRotated == NO) 
        {
            NSLog(@"Rotating to portait");
            hasRotated = YES;
            [UIView beginAnimations: @"" context:nil];
            [UIView setAnimationDuration: 0];
            self.view.transform = CGAffineTransformIdentity;
            self.view.transform = CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(-90));
            self.view.bounds = CGRectMake(0.0f, 0.0f, 480.0f, 320.0f);
            self.view.frame = CGRectMake(0.0f, 0.0f, 480.0f, 320.0f);
            [UIView commitAnimations];

    }
}
else if (UIDeviceOrientationIsLandscape( orientationa))
{
    if (hasRotated) 
    {
        NSLog(@"Rotating to lands");
        hasRotated = NO;
        [UIView beginAnimations: @"" context:nil];
        [UIView setAnimationDuration: 0];
        self.view.transform = CGAffineTransformIdentity;
        self.view.transform = CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(0));
        self.view.bounds = CGRectMake(0.0f, 0.0f, 320.0f, 480.0f);
        self.view.frame = CGRectMake(0.0f, 0.0f, 320.0f, 480.0f);
        [UIView commitAnimations];

    }
}

Beachten Sie alle Super Views/Subviews, die Auto-Sizing verwenden, da die view.bounds/frame explizit zurückgesetzt werden...

Der einzige Nachteil dieser Methode, die Ansicht im Querformat zu halten, ist der inhärente Animationswechsel zwischen den Ausrichtungen, der auftreten muss, wenn es besser wäre, keine Änderung zu haben.

1voto

Bo A Punkte 3107

IOS 6 Lösung:

[[[self window] rootViewController] presentViewController:[[UIViewController alloc] init] animated:NO completion:^{
    [[[self window] rootViewController] dismissViewControllerAnimated:NO completion:nil];
}];

Der genaue Code hängt von der jeweiligen Anwendung ab und auch davon, wo Sie ihn platzieren (ich habe ihn in meinem AppDelegate verwendet). Ersetzen Sie [[self window] rootViewController] mit dem, was Sie verwenden. Ich habe eine UITabBarController .

0voto

Vinzius Punkte 2930

Ich habe eine Lösung gefunden und etwas auf Französisch geschrieben (aber der Code ist auf Englisch). aquí

Der Weg ist, den Controller zur Fensteransicht hinzuzufügen (der Controller muss eine gute Implementierung der Funktion shouldRotate.... besitzen).

-3voto

Martin Gordon Punkte 36034

Wenn Sie UIViewControllers verwenden, gibt es diese Methode:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

Rückkehr NO für die View-Controller, die die Views enthalten, die nicht gedreht werden sollen.

Mehr Informationen hier

-3voto

Andrew Grant Punkte 57342

Ich glaube nicht, dass dies möglich ist, zur Laufzeit zu tun, obwohl Sie natürlich nur eine 90-Grad-Transformation auf Ihre UI anwenden könnten.

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