web-dev-qa-db-fra.com

Comment définir l'orientation du périphérique (UI) par programme?

Voudrait que tout sur l’écran (UI) puisse pivoter de paysage de gauche à droite ou inversement. 

Comment puis-je faire cela? Est-ce privé? 

Je le sais 

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {}

vous permet de définir les orientations possibles de l'interface utilisateur, mais existe-t-il un moyen de ne forcer qu'une seule à la fois? 

À votre santé

23
Sam Jarman

Cette méthode est appelée pour déterminer si votre interface doit automatiquement pivoter selon une rotation donnée (c’est-à-dire laisser UIKit faire le gros travail plutôt que de le faire manuellement).

Donc, si vous voulez que votre application fonctionne uniquement en mode paysage, implémentez le corps de cette méthode avec:

return UIInterfaceOrientationIsLandscape(interfaceOrientation);

Si vous voulez que votre interface utilisateur tourne automatiquement vers toutes les orientations, vous pouvez simplement return YES;

Est-ce ce que vous demandiez?

16
tobyc

Dans iOS, la méthode [[UIDevice currentDevice] setDeviceOrientation:UIDeviceOrientationSomeOrientation] est absente. Mais nous pouvons faire pivoter une vue avec la barre d'état, pour cela:

- (void)showAlbum {
    // check current orientation
    if ([[UIApplication sharedApplication] statusBarOrientation] != UIInterfaceOrientationLandscapeLeft) {
        // no, the orientation is wrong, we must rotate the UI
        self.navigationController.view.userInteractionEnabled = NO;
        [UIView beginAnimations:@"newAlbum" context:NULL];
        [UIView setAnimationDelegate:self];
        // when rotation is done, we can add new views, because UI orientation is OK
        [UIView setAnimationDidStopSelector:@selector(addAlbum)];
        // setup status bar
        [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeLeft  animated:NO];
        // rotate main view, in this sample the view of navigation controller is the root view in main window
        [self.navigationController.view setTransform: CGAffineTransformMakeRotation(M_PI / 2)];
        // set size of view
        [self.navigationController.view setFrame:CGRectMake(0, 0, 748, 1024)];
        [UIView commitAnimations];
    } else {
        [self addAlbum];
    }

}
24
UIBuilder

J'ai eu du succès avec ça:

 if (self.interfaceOrientation != UIInterfaceOrientationPortrait) {
    // http://stackoverflow.com/questions/181780/is-there-a-documented-way-to-set-the-iphone-orientation
    // http://openradar.appspot.com/radar?id=697
    // [[UIDevice currentDevice] setOrientation:UIInterfaceOrientationPortrait]; // Using the following code to get around Apple's static analysis...
    [[UIDevice currentDevice] performSelector:NSSelectorFromString(@"setOrientation:") withObject:(id)UIInterfaceOrientationPortrait];
}
18
Chris

Si vous présentez un contrôleur de vue modale qui implémente -shouldAutorotateToInterfaceOrientation: pour prendre en charge une seule orientation, l’interface entière y sera automatiquement forcée. Je ne pense pas qu'il y ait un moyen de changer d'orientation par programme autrement.

5

Aussi cette façon simple fonctionne:

[[UIApplication sharedApplication] setStatusBarHidden:YES];
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight];

et retour:

[[UIApplication sharedApplication] setStatusBarHidden:NO];
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait];
3
Pavel

Dans Swift pour changer l'orientation en portrait:

UIDevice.currentDevice().setValue(UIInterfaceOrientation.Portrait.rawValue, forKey: "orientation")

Voir: https://stackoverflow.com/a/24259601

3
Cristian Radu

Guntis Treulands https://stackoverflow.com/a/10146270/894671

//-----------------------------------
// FORCE PORTRAIT CODE
//-----------------------------------
[[UIApplication sharedApplication] setStatusBarOrientation:UIDeviceOrientationPortrait animated:NO];
//present/dismiss viewcontroller in order to activate rotating.
UIViewController *mVC = [[UIViewController alloc] init];
[self presentModalViewController:mVC animated:NO];
[self dismissModalViewControllerAnimated:NO];
2
to0nice4eva

Même si ce n’est pas une solution oisive, cela fonctionne bien pour moi.

- (void)viewDidLoad
{
   self.view.transform = CGAffineTransformIdentity;
   self.view.transform = CGAffineTransformMakeRotation((M_PI * (90) / 180.0)); 
   self.view.bounds = CGRectMake(0.0, 0.0, 480, 320);
}
0
byJeevan

Comme suggéré sur un thread connexeshouldAutorotateToInterfaceOrientation est obsolète. Les nouvelles applications doivent utiliser les méthodes suivantes décrites dans la référence de classe UIViewController d'Apple jusqu'à ce qu'elles deviennent elles-mêmes obsolètes:

  • shouldAutorotate,
  • preferredInterfaceOrientationForPresentation; et
  • attemptRotationToDeviceOrientation.

D'après ce que j'ai compris, il est préférable d'utiliser différents contrôleurs de vue pour les vues qui doivent être verrouillées dans un mode d'orientation (c'est-à-dire privilégié) qui diffère du dernier.

0
Josh Habdas
if ([[UIDevice currentDevice] respondsToSelector:@selector(setOrientation:)]) {
        objc_msgSend([UIDevice currentDevice], @selector(setOrientation:),    UIInterfaceOrientationLandscapeLeft );
    }
0
hariszaman