45 votes

Comment faire pour modifier l'orientation du périphérique par programmation dans iOS 6

Dans iOS 5 on pouvait changer l'orientation du périphérique par programme comme suit:

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];

Mais dans iOS 6 setOrientation est amorti, comment puis-je changer l'orientation du périphérique par programmation dans iOS 6?

49voto

Voici mes "cinq cents", testé sur iOS7 avec ARC

[[UIDevice currentDevice] setValue:
                      [NSNumber numberWithInteger: UIInterfaceOrientationPortrait]
                            forKey:@"orientation"];

Cela ne marche pas générer de "fuite" d'avertissement comme performSelector volonté.

UIAlertView - avec ce code, lorsque vous ouvrez UIAlertView pendant (/Ne)apparaissent, vous remarquerez que toutes mais ce point de vue en mode portrait (apple, vraiment?) Je n'étais pas en mesure de forcer l'affichage de réorienter, mais a constaté que si vous mettez léger délai avant l'ouverture de la UIAlertView puis vue a le temps de changer d'orientation.

Remarque je suis la libération de mes app de la semaine commençant le 12/09/2014 et je mettrai à jour le post si elle réussit ou échoue.

20voto

Bala Points 1887

iOS 6 de l'INTERFACE utilisateur de l'Interface d'Orientation - shouldAutorotateToInterfaceOrientation: Pas de Travail

La méthode shouldAutorotateToInterfaceOrientation: n'est PAS pris en charge dans iOS 6. Ses obsolète. Juste au cas où si vous êtes un débutant, qui regardait juste de travail dans le cacao, et vous demandez-vous pourquoi votre point de vue contrôleur foiré dans iOS 6 et parfait dans iOS 5, il suffit de savoir que shouldAutorotateToInterfaceOrientation: n'est pas supportée. Même si elle peut très bien fonctionner avec Xcode 4 à 4,3 elle ne fonctionne PAS sur Xcode 4.5.

Apple propose une nouvelle méthode pour obtenir cette chose faite, dans une grande femme de la mode. Vous utilisez supportedInterfaceOrientations à la place. Il renvoie à l'ensemble de l'interface orientations que la vue contrôleur prend en charge, un masque de l'interface valeurs d'orientation.

UIInterfaceOrientationMask Enum:

Ces constantes sont masque de bits pour spécifier une-vue-contrôleur est pris en charge à l'interface des orientations.

typedef enum {
    UIInterfaceOrientationMaskPortrait = (1 << UIInterfaceOrientationPortrait),
    UIInterfaceOrientationMaskLandscapeLeft = (1 << UIInterfaceOrientationLandscapeLeft),
    UIInterfaceOrientationMaskLandscapeRight = (1 << UIInterfaceOrientationLandscapeRight),
    UIInterfaceOrientationMaskPortraitUpsideDown = (1 << UIInterfaceOrientationPortraitUpsideDown),
    UIInterfaceOrientationMaskLandscape =
        (UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight),
    UIInterfaceOrientationMaskAll =
        (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft |
    UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskPortraitUpsideDown),
    UIInterfaceOrientationMaskAllButUpsideDown =
        (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft |
    UIInterfaceOrientationMaskLandscapeRight),
} UIInterfaceOrientationMask;

À l'aide de shouldAutorotateToInterfaceOrientation: méthode:

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    return UIInterfaceOrientationIsLandscapeRight(toInterfaceOrientation);
}

À l'aide de supportedInterfaceOrientations méthode:

-(NSUInteger)supportedInterfaceOrientations{
    return UIInterfaceOrientationMaskLandscapeRight;
}

Ce sont les méthodes ajoutées à UIViewController sur l'Orientation dans iOS6

  1. UIViewController preferredInterfaceOrientationForpresentation

  2. UIViewController shouldAutorotate

  3. UIViewController supportedInterfaceOrientations

Ajout des méthodes de UIApplication sur l'Orientation dans iOS6

  1. UIApplication supportedInterfaceOrientationsForwindow:

  2. UIInterfaceOrientationMask

20voto

P.L. Points 488

J'ai trouvé que la façon la plus simple de la force de l'appareil pour modifier l'orientation est de présenter un nouveau point de vue contrôleur (à l'aide d' presentViewController:animated:completion:) lorsque le nouveau-vue-contrôleur spécifié un particulier orientation privilégiée (par la mise en œuvre de la méthode -(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation).

Lorsqu'un nouveau-vue-contrôleur est présenté, comme prévu, l'orientation va changer à la préférence de la nouvelle-vue-contrôleur. Donc, le plus simple de mise en œuvre (les meilleures pratiques?) sera d'intégrer toutes les fonctionnalités dont vous avez besoin dans une orientation spécifique dans une vue séparée de contrôleur, et de le présenter en tant que de besoin. Le système va prendre soin de changer l'orientation pour vous.

Évidemment, cela peut ne pas convenir à tous les cas d'utilisation, mais, heureusement, la même chose est applicable à la force de l'appareil pour modifier l'orientation de l'existant-vue-contrôleur.

L'astuce est de présenter un nouveau point de vue contrôleur de la spécificité de l'orientation préférée que vous nécessaire, et ensuite se cacher immédiatement. Ce sera la cause de l'orientation de changement temporaire lorsque le nouveau-vue-contrôleur est présenté. La meilleure partie est, lorsque le nouveau-vue-contrôleur est rejeté, l'original (à présenter) vue du contrôleur preferredInterfaceOrientationForPresentation est interrogé de nouveau, vous pouvez spécifier l'orientation finale que vous voulez ici.

Une chose importante à regarder ici est aussi temporaire de désactiver la rotation automatique de l'affichage d'origine contrôleur (en rentrant de la nouvellement présenté-puis-rejeté-vue-contrôleur), de sorte que lorsque l'utilisateur de faire pivoter leur téléphone vers la nouvelle orientation, il n'a pas déclenché d'autres de la rotation automatique.

Le code suivant doit illustrer mon point de vue, mon exemple de rotation des forces de portrait, il suffit de modifier en conséquence si vous voulez d'autres de l'orientation.

En supposant que vous avez la vue d'origine contrôleur nommé Original, et une temporaire-vue-contrôleur nommé ForcePortrait

@interface Original : UIViewController
{
    BOOL orientationToPortrait; //should set to NO by default
}
@end

@implementation Original
- (UIInterfaceOrientation) preferredInterfaceOrientationForPresentation
{
    if(orientationToPortrait)
    {
        //when we manually changed, show in Portrait
        return UIInterfaceOrientationPortrait;
    }
    else
    {
        //before manual orientation change, we allow any orientation
        return self.interfaceOrientation;
    }
}

-(BOOL) shouldAutorotate
{
    //we should 'lock' the rotation once we manually change it
    return !orientationToPortrait;
}

-(void) changeOrientationToPortrait
{
    //Sample method to change the orientation
    //when called, will show (and hide) the temporary view
    //Original.preferredInterfaceOrientationForPresentation will be called again after this method

    //flag this to ensure that we tell system we prefer Portrait, whenever it asked again
    orientationToPortrait = YES;

    //presenting the following VC will cause the orientation to temporary change
    //when the new VC is dismissed, system will ask what is our (Original) orientation preference again
    ForcePortrait* forcePortrait = [[ForcePortrait alloc] init];
    [self presentViewController:forcePortrait animated:NO completion:^{
        [forcePortrait dismissViewControllerAnimated:NO completion:nil];
    }];
}


@end

@interface ForcePortrait : UIViewController
@end

@implementation ForcePortrait
- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return UIInterfaceOrientationPortrait;
}
@end

10voto

Bissy Points 101

Essayez ceci:

#import <objc/message.h>

if(UIDeviceOrientationIsLandscape(self.interfaceOrientation)){
        if ([[UIDevice currentDevice] respondsToSelector:@selector(setOrientation:)])
        {
            objc_msgSend([UIDevice currentDevice], @selector(setOrientation:), UIInterfaceOrientationPortrait );
        }
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X