94 votes

Existe-t-il un moyen documenté de régler l'orientation de l'iPhone ?

J'ai une application pour laquelle j'aimerais prendre en charge la rotation du dispositif dans certaines vues, mais d'autres n'ont pas vraiment de sens en mode paysage. Ainsi, lorsque je change de vue, j'aimerais forcer la rotation à être réglée sur le mode portrait.

Il existe une propriété non documentée sur UIDevice qui fait l'affaire mais génère évidemment un avertissement du compilateur et pourrait disparaître avec une future révision du SDK.

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationPortrait];

Existe-t-il des moyens documentés pour forcer l'orientation ?

Mise à jour : Je pensais fournir un exemple, car je ne cherche pas à savoir si shouldAutorotateToInterfaceOrientation, puisque je l'ai déjà mis en œuvre.

J'ai déjà implémenté shouldAutorotateToInterfaceOrientation pour toutes les vues, mais si l'utilisateur est en mode paysage dans la vue 1 et qu'il passe ensuite à la vue 2, je veux forcer le téléphone à pivoter de nouveau en mode portrait.

101voto

Josh Points 999

C'est bien après coup, mais juste au cas où quelqu'un qui n'utilise pas un contrôleur de navigation et/ou ne souhaite pas utiliser des méthodes non documentées se présenterait :

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

Il suffit de présenter et de rejeter un contrôleur de vue vanille.

Évidemment, vous devrez toujours confirmer ou refuser l'orientation dans votre surcharge de shouldAutorotateToInterfaceOrientation. Mais cela fera que shouldAutorotate... sera à nouveau appelé par le système.

16voto

Bdebeez Points 2066

D'après ce que je peux dire, le setOrientation: ne fonctionne pas (ou peut-être ne fonctionne plus). Voici ce que je fais pour y parvenir :

Tout d'abord, mettez cette définition en haut de votre fichier, juste sous votre #imports :

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

alors, dans le viewWillAppear: méthode

[[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);
}

si vous voulez que ce soit animé, vous pouvez envelopper le tout dans un bloc d'animation, comme ceci :

[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];

Ensuite, dans votre contrôleur en mode portrait, vous pouvez faire l'inverse : vérifiez s'il est actuellement en mode paysage, et si c'est le cas, faites-le pivoter en mode portrait.

16voto

Michael Gaylord Points 2728

Si vous voulez le forcer à pivoter du portrait au paysage, voici le code. Notez simplement que vous devez ajuster le centre de votre vue. J'ai remarqué que le mien ne plaçait pas la vue au bon endroit. Sinon, cela a parfaitement fonctionné. Merci pour l'astuce.

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];
}

7voto

Guntis Treulands Points 3354

Il existe un moyen simple de forcer par programme l'iPhone à adopter l'orientation nécessaire - en utilisant deux des réponses déjà fournies par 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];

fonctionne comme un charme :)

EDITAR:

pour iOS 6, je dois ajouter cette fonction : (fonctionne sur le viewcontroller modal)

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

6voto

John K Points 181

Ce n'est plus un problème avec la version 3.1.2 du SDK de l'iPhone. Il semble maintenant que l'orientation demandée de la vue repoussée sur la pile soit respectée. Cela signifie probablement que vous devrez détecter les versions plus anciennes de l'iPhone OS et n'appliquer le setOrientation que lorsqu'il est antérieur à la dernière version.

Il n'est pas certain que l'analyse statique d'Apple comprenne que vous contournez les limitations de l'ancien SDK. Personnellement, Apple m'a demandé de supprimer l'appel de méthode lors de ma prochaine mise à jour. Je ne sais donc pas encore si le fait d'avoir un hack pour les anciens appareils passera le processus d'approbation.

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