Problème iOS 6 supportedInterfaceOrientations

Dans mon controller de vue, j'implémente deux methods pour contrôler l'orientation de l'interface:

- (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait; } - (BOOL)shouldAutorotate { return YES; } 

Dans la méthode supportedInterfaceOrientations , je returnne UIInterfaceOrientationMaskPortrait mais à ce moment-là j'ai réalisé que la méthode shouldAutorotate n'est pas appelée.

Mais je change pour return UIInterfaceOrientationPortrait dans la méthode supportedInterfaceOrientations . La méthode shouldAutorotate est appelée, mais une erreur est mentionnée ci-dessous:

UIApplicationInvalidInterfaceOrientation , raison: 'Les orientations supscopes n'ont pas d'orientation commune avec l'application, et shouldAutorotate returnne YES'

En passant, je sélectionne toutes les orientations dans les orientations d'interface supscopes.

ÉDITÉ

J'utilise viewController et je l'intègre avec navigationController. voici AppDelegate.h

 @interface AppDelegate : UIResponder <UIApplicationDelegate,UINavigationControllerDelegate> @property (strong, nonatomic) UIWindow *window; @property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext; @property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel; @property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator; @property (readonly, strong, nonatomic) UINavigationController *navController; - (void)saveContext; - (NSURL *)applicationDocumentsDirectory; @end 

dans la méthode didFinishLaunchingWithOptions sous AppDelegate.m

  navController = (UINavigationController *)self.window.rootViewController; IPad_HomeViewController *rootVC=(IPad_HomeViewController *)navController.topViewController; rootVC.managedObjectContext = self.managedObjectContext; return YES; 

dans mon IPad_HomeViewController,

 @interface IPad_HomeViewController : UIViewController <UINavigationControllerDelegate> @property (strong, nonatomic) NSManagedObjectContext *managedObjectContext; @end 

 - (BOOL) shouldAutorotate { return YES; } // for landscape - (NSInteger) supportedInterfaceOrientations { return (1 << UIInterfaceOrientationLandscapeLeft) | (1 << UIInterfaceOrientationLandscapeRight); } 

Comme indiqué ci-dessus, consultez les valeurs de masque pour les orientations spécifiques: UIInterfaceOrientationMask values. UIInterfaceOrientationMask

Deux points:

  1. Votre message d'erreur prend tout son sens car cela n'a pas de sens d'utiliser UIInterfaceOrientationPortrait comme valeur de return de supportedInterfaceOrientations , qui returnne un masque de bits. Utilisez l'une des valeurs UIInterfaceOrientationMask .

  2. Vous semblez craindre que si vous utilisez le bon UIInterfaceOrientationMaskPortrait , cet iOS ne semble pas appeler shouldAutorotate . Il peut uniquement appeler shouldAutorotate si, après avoir pris en count l'orientation physique du périphérique physique et l'orientation actuelle de l'application par rapport à la propriété supportedInterfaceOrientations , une rotation peut être nécessaire. Pourquoi devrait-il vérifier shouldAutorotate s'il conclut que l'appareil est déjà dans une orientation acceptable?

Voir supportedInterfaceOrientations et Handling View Rotations pour plus d'informations.

Je sais que cela semble assez élémentaire, mais je me tortillais le cerveau pour comprendre les problèmes d'orientation lors de tests sur mon iPhone – J'ai eu le mode de locking automatique en mode portrait – donc rien de ce que j'ai changé par programme importait – !

Pour modifier le paramètre d'orientation, select le menu Cibles-> Résumé-> Orientations de périphérique sockets en charge et modifiez les éléments suivants.

Si les buttons d'orientation sont sombres, cela signifie que vous l'avez sélectionné comme orientation. entrez la description de l'image ici

plutôt que d'utiliser un entier pour déclarer l'orientation, pourquoi n'utilisez-vous pas un boolean et twigz-y une instruction if pour détecter l'orientation souhaitée. voici un exemple de code qui, je l'espère, vous aidera:

 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { if (interfaceOrientation == UIInterfaceOrientationPortrait) { return YES; } if (interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) { return YES; } return NO; } 

vous pouvez append toutes les orientations dans l'instruction if et cela devrait fonctionner correctement. adrian

Modifier:

et si vous voulez avoir une option pour ios 6 le code ci-dessous devrait fonctionner très bien pour vous.

 - (BOOL) shouldAutorotate { return YES; } -(NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown; } 

vous pouvez changer à peu près toutes les orientations supscopes avec ceci dans ios 6. encoding heureux

EDIT 1:

Pour faire pivoter seulement certains viewcontrollers d'une certaine manière, il suffit d'utiliser le code ios 6 que j'ai posté ci-dessus dans tous les viewcontrollers . voici les étapes:

  1. Au niveau du projet où se trouvent les quatre internfaceorientations , allez-y et éteignez tout pour que l'application passe par défaut.

  2. implémenter le code ios 6 que j'ai fourni dans tous les viewcontrollers .

  3. plutôt que oui déclarer non dans la méthode shouldautorotate .
  4. dans la deuxième méthode, twigz n'importe quel type d'orientation que vous voulez.

Cela devrait faire l'affaire pour vous. encoding heureux