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