Comment utiliser les méthodes suivantes pour prendre en charge l'orientation d'interface dans iOS 6.0:
shouldAutorotate
supportedInterfaceOrientations
preferredInterfaceOrientationForPresentation
Comme "shouldAutorotateToInterfaceOrientation" est déconseillé dans iOS 6.0.
Veuillez fournir des extraits de code pour prendre en charge vos réponses.
Merci.
Méthode obsolète dans iOS 5:
// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationLandscapeRight);
}
Remplacement dans iOS 6 et équivalent de cette méthode iOS 5 obsolète ci-dessus:
- (BOOL) shouldAutorotate
{
return YES;
}
-(NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskLandscapeRight;
}
J'espère que cela t'aides.
[edit # 1: Ajout de mon UIViewController qui démarre avec succès en mode Portrait dans XCode 4.5 sur iPhone 6.0 Simulator]
#import "FirstViewController.h"
@interface FirstViewController ()
@end
@implementation FirstViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self)
{
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}
-(BOOL)shouldAutorotate
{
return NO;
}
-(NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskAll;
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
return UIInterfaceOrientationMaskPortrait;
}
[# edit 2: exemple de code d'une application en mode paysage uniquement qui prend en charge iOS 5 et iOS 6]
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return (interfaceOrientation == UIInterfaceOrientationLandscapeRight) || (interfaceOrientation == UIInterfaceOrientationLandscapeLeft);
}
- (BOOL)shouldAutorotate {
return YES;
}
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskLandscape;
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
return UIInterfaceOrientationLandscapeLeft;
}
Soit dit en passant, vos paramètres sur les paramètres de votre projet Xcode ont désormais la priorité. Assurez-vous que vous définissez correctement le tableau "Orientations d'interface prises en charge" dans les paramètres de votre projet. C'était le problème pour moi. Supprimé les indésirables et mon application a fonctionné comme lors de la compilation avec Xcode 4.4.1
Mon application possède une instance d'une sous-classe UINavigationController personnalisée, qui présente plusieurs contrôleurs de vue, tous en mode portrait uniquement, sauf lors de la lecture d'une vidéo, auquel cas je souhaite en outre autoriser les deux orientations paysage.
D'après la réponse de @uerceg, voici mon code.
Tout d'abord, j'ai activé Portrait, Paysage gauche et Paysage droit dans Xcode -> Cible -> Résumé.
Dans l'implémentation de la sous-classe UINavigationController, I #import
'ed <MediaPlayer/MediaPlayer.h>
.
Ensuite, j'ai implémenté ces méthodes:
// Autorotation (iOS <= 5.x)
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
if ([self modalViewController] && [[self modalViewController] isKindOfClass:[MPMoviePlayerController class]]) {
// Playing Video: Anything but 'Portrait (Upside down)' is OK
return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}
else{
// NOT Playing Video: Only 'Portrait' is OK
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
}
// Autorotation (iOS >= 6.0)
- (BOOL) shouldAutorotate
{
return YES;
}
-(NSUInteger)supportedInterfaceOrientations
{
NSUInteger orientations = UIInterfaceOrientationMaskPortrait;
if ([self modalViewController] && [[self modalViewController] isKindOfClass:[MPMoviePlayerController class]]) {
// Playing Video, additionally allow both landscape orientations:
orientations |= UIInterfaceOrientationMaskLandscapeLeft;
orientations |= UIInterfaceOrientationMaskLandscapeRight;
}
return orientations;
}
Le code de NicolasMiari a fonctionné pour moi. Un peu différent, j'avais un UITabBarController qui présentait UINavigationControllers et j'utilisais StoryBoards. L'implémentation de la sous-classe UITabBarController est exactement la même et soyez patient avec la sélection de classe pour le contrôleur de barre d'onglets dans les story-boards. Il n'est pas immédiatement disponible même après la construction.
https://devforums.Apple.com/thread/165384?tstart=
https://devforums.Apple.com/thread/166544?tstart=
Il y a un certain nombre d'exemples et de suggestions dans les fils ci-dessus concernant la prise en charge des changements d'orientation d'interface sur iOS6, les deux fils liés aux problèmes avec les vues du Game Center mais devraient suffire pour vous aider à démarrer.
Vous devriez également vérifier les notes de version iOS6 sous UIKit, malheureusement je ne peux pas vous donner de lien direct depuis que je suis nouveau.
Éviter de publier du code ici en raison de la NDA
J'espère que cela pourra aider