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.

7voto

Guntis Treulands Punkte 4725

Es gibt eine einfache Möglichkeit, das iPhone programmatisch in die erforderliche Ausrichtung zu zwingen - unter Verwendung von zwei der bereits bereitgestellten Antworten von kdbdallas , Josh :

//will rotate status bar
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight];

//will re-rotate view according to statusbar
UIViewController *c = [[UIViewController alloc]init];
[self presentModalViewController:c animated:NO];
[self dismissModalViewControllerAnimated:NO];
[c release];

funktioniert wie ein Zauber :)

EDIT:

für iOS 6 muss ich diese Funktion hinzufügen: (funktioniert bei modalen Viewcontrollern)

- (NSUInteger)supportedInterfaceOrientations
{
    return (UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight);
}

5voto

Christian Schnorr Punkte 10608

Die Antwort von Josh ist für mich in Ordnung.

Ich ziehe es jedoch vor, eine "Orientierung hat sich geändert, bitte UI aktualisieren" Benachrichtigung. Wenn diese Benachrichtigung von einem View-Controller empfangen wird, ruft er shouldAutorotateToInterfaceOrientation: und ermöglicht es Ihnen, eine beliebige Ausrichtung festzulegen, indem Sie YES für die von Ihnen gewünschte Ausrichtung.

[[NSNotificationCenter defaultCenter] postNotificationName:UIDeviceOrientationDidChangeNotification object:nil];

Das einzige Problem ist, dass dies eine Neuausrichtung erzwingt ohne eine Animation. Sie müssen diese Zeile zwischen folgenden Zeilen einfügen beginAnimations: y commitAnimations um einen reibungslosen Übergang zu erreichen.

Ich hoffe, das hilft.

3voto

Henry Cooke Punkte 2493

FWIW, hier ist meine Implementierung der manuellen Einstellung der Ausrichtung (in Ihrer app's Root View Controller, natch gehen):

-(void)rotateInterfaceToOrientation:(UIDeviceOrientation)orientation{

    CGRect bounds = [[ UIScreen mainScreen ] bounds ];
    CGAffineTransform t;
    CGFloat r = 0;
    switch ( orientation ) {
        case UIDeviceOrientationLandscapeRight:
            r = -(M_PI / 2);
            break;
        case UIDeviceOrientationLandscapeLeft:
            r  = M_PI / 2;
            break;
    }
    if( r != 0 ){
        CGSize sz = bounds.size;
        bounds.size.width = sz.height;
        bounds.size.height = sz.width;
    }
    t = CGAffineTransformMakeRotation( r );

    UIApplication *application = [ UIApplication sharedApplication ];

    [ UIView beginAnimations:@"InterfaceOrientation" context: nil ];
    [ UIView setAnimationDuration: [ application statusBarOrientationAnimationDuration ] ];
    self.view.transform = t;
    self.view.bounds = bounds;
    [ UIView commitAnimations ];

    [ application setStatusBarOrientation: orientation animated: YES ];     
}

gekoppelt mit dem Folgenden UINavigationControllerDelegate Methode (vorausgesetzt, Sie verwenden eine UINavigationController ) :

-(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated{
    // rotate interface, if we need to
    UIDeviceOrientation orientation = [[ UIDevice currentDevice ] orientation ];
    BOOL bViewControllerDoesSupportCurrentOrientation = [ viewController shouldAutorotateToInterfaceOrientation: orientation ];
    if( !bViewControllerDoesSupportCurrentOrientation ){
        [ self rotateInterfaceToOrientation: UIDeviceOrientationPortrait ];
    }
}

Das sorgt dafür, dass die Wurzelansicht gedreht wird, je nachdem, ob eine eingehende UIViewController unterstützt die aktuelle Geräteausrichtung. Zum Schluss müssen Sie Folgendes anschließen rotateInterfaceToOrientation auf tatsächliche Ausrichtungsänderungen des Geräts, um die iOS-Standardfunktionalität zu imitieren. Fügen Sie diesen Ereignishandler zum gleichen Root-View-Controller hinzu:

-(void)onUIDeviceOrientationDidChangeNotification:(NSNotification*)notification{
    UIViewController *tvc = self.rootNavigationController.topViewController;
    UIDeviceOrientation orientation = [[ UIDevice currentDevice ] orientation ];
    // only switch if we need to (seem to get multiple notifications on device)
    if( orientation != [[ UIApplication sharedApplication ] statusBarOrientation ] ){
        if( [ tvc shouldAutorotateToInterfaceOrientation: orientation ] ){
            [ self rotateInterfaceToOrientation: orientation ];
        }
    }
}

Registrieren Sie sich schließlich für UIDeviceOrientationDidChangeNotification Benachrichtigungen in init o loadview etwa so:

[[ NSNotificationCenter defaultCenter ] addObserver: self
                                           selector: @selector(onUIDeviceOrientationDidChangeNotification:)
                                               name: UIDeviceOrientationDidChangeNotification
                                             object: nil ];
[[ UIDevice currentDevice ] beginGeneratingDeviceOrientationNotifications ];

2voto

user324168 Punkte 21

Das funktioniert bei mir (danke Henry Cooke):

Mein Ziel war es, nur die Änderungen der Landschaftsausrichtung zu behandeln.

init-Methode:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(orientationChanged:)
                                             name:UIDeviceOrientationDidChangeNotification
                                           object:nil];

- (void)orientationChanged:(NSNotification *)notification {    
    //[[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];
    UIDeviceOrientation orientation = [UIDevice currentDevice].orientation;
    CGRect bounds = [[ UIScreen mainScreen ] bounds ];
    CGAffineTransform t;
    CGFloat r = 0;
    switch ( orientation ) {
        case UIDeviceOrientationLandscapeRight:
            r = 0;
            NSLog(@"Right");
            break;
        case UIDeviceOrientationLandscapeLeft:
            r  = M_PI;
            NSLog(@"Left");
            break;
        default:return;
    }

    t = CGAffineTransformMakeRotation( r );

    UIApplication *application = [ UIApplication sharedApplication ];
    [ UIView beginAnimations:@"InterfaceOrientation" context: nil ];
    [ UIView setAnimationDuration: [ application statusBarOrientationAnimationDuration ] ];
    self.view.transform = t;
    self.view.bounds = bounds;
    [ UIView commitAnimations ];

    [ application setStatusBarOrientation: orientation animated: YES ];
}

1voto

stephencampbell Punkte 61

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.

Ich weiß, dass der obige Originalbeitrag in diesem Thread schon sehr alt ist, aber ich hatte ein ähnliches Problem wie er - d.h. alle Bildschirme in meiner App sind nur im Hochformat, mit Ausnahme eines Bildschirms, der vom Benutzer zwischen Quer- und Hochformat gedreht werden kann.

Das war einfach genug, aber wie bei anderen Beiträgen wollte ich, dass die App automatisch ins Hochformat zurückkehrt, unabhängig von der aktuellen Geräteausrichtung, wenn ich zum vorherigen Bildschirm zurückkehre.

Die von mir implementierte Lösung bestand darin, die Navigationsleiste im Querformat auszublenden, so dass der Benutzer nur im Hochformat zu den vorherigen Bildschirmen zurückkehren kann. Daher können alle anderen Bildschirme nur im Hochformat angezeigt werden.

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)pInterfaceOrientation {
    BOOL lHideNavBar = self.interfaceOrientation == UIInterfaceOrientationPortrait ? NO : YES;
    [self.navigationController setNavigationBarHidden:lHideNavBar animated:YES];
}

Dies hat für meine App den zusätzlichen Vorteil, dass im Querformat mehr Platz auf dem Bildschirm zur Verfügung steht. Das ist nützlich, weil der betreffende Bildschirm für die Anzeige von PDF-Dateien verwendet wird.

Ich hoffe, das hilft.

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