J'ai un projet utilisant UINavigationController
et segues
fonctionnant correctement bien, ils tournent tous correctement, le problème est ... Je veux juste désactiver autorotation
sur un UIViewController
. J'ai essayé ceci:
- (BOOL)shouldAutorotateToInterfaceOrientation:
(UIInterfaceOrientation)interfaceOrientation {
return NO;
}
// New Autorotation support for iOS 6.
- (BOOL)shouldAutorotate NS_AVAILABLE_IOS(6_0){
return NO;
}
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskPortrait;
}
mais cela ne fonctionne pas, mon UIViewController
continue de tourner automatiquement, toute aide sera la bienvenue :)
Selon le Guide de programmation de View Controller
Si vous souhaitez désactiver temporairement la rotation automatique, évitez de manipuler les masques d'orientation pour ce faire. Au lieu de cela, remplacez la méthode shouldAutorotate sur le contrôleur de vue initial. Cette méthode est appelée avant d'effectuer une autorotation. S'il renvoie NO, la rotation est supprimée.
Vous devez donc sous-classer 'UINavigationController', implémenter shouldAutorotate et utiliser votre classe de contrôleur de navigation dans votre storyboard.
- (BOOL)shouldAutorotate
{
id currentViewController = self.topViewController;
if ([currentViewController isKindOfClass:[DetailViewController class]])
return NO;
return YES;
}
Je vais compléter la réponse de GayleDDS pour les débutants vient d'ajouter une sous-classe de UINavigationController comme il l'a suggéré comme ceci:
#import "UINavigationController.h"
#import "MonthCalendarVC.h"
@implementation UINavigationController (overrides)
- (BOOL)shouldAutorotate
{
id currentViewController = self.topViewController;
if ([currentViewController isKindOfClass:[MonthCalendarVC class]])
return NO;
return YES;
}
@end
MonthCalendarVC est le viewController que je veux être juste en mode portrait (fixe), puis j'ai simplement ajouté l'importation à mon appdelegate.m
#import "UINavigationController.h"
et c'est tout
Jetez un œil à cette autre approche:
http://www.sebastianborggrewe.de/only-make-one-single-view-controller-rotate/
Il vous suffit d'implémenter canRotate dans un ViewController pour permettre la rotation.
Fonctionne bien sur iOS 7.
30/01/2015 Parce que le site de sebastian ne semble pas fonctionner (erreur 404), voici mon interprétation de sa solution:
Contrairement à Sébastien, je préfère utiliser un protocole (comme une interface en C #) pour éviter de créer une méthode "- (void) canrotate:" dans chacun de mon contrôleur de vue.
IRotationCapabilities.h
-----------------------
#ifndef Nice_APPS_IRotationCapabilities_h
#define Nice_APPS_IRotationCapabilities_h
@protocol IRotationCapabilities < NSObject >
// Empty protocol
@end
#endif
FirstViewController.h
---------------------
- ( void )viewWillAppear:( BOOL )animated
{
[ super viewWillAppear:animated ];
// Forces the portrait orientation, if needed
if( ![ self conformsToProtocol:@protocol( IRotationCapabilities ) ] )
{
if( self.navigationController.interfaceOrientation != UIInterfaceOrientationPortrait )
{
[ [ UIDevice currentDevice ] setValue:@( 1 ) forKey:@"orientation" ];
}
}
}
SecondViewController.h
-----------------------
#import "IRotationCapabilities.h"
@interface SecondViewController : UIViewController < IRotationCapabilities >
AppDelegate.m
-------------
#pragma mark - Orientation management
- ( NSUInteger )application:( UIApplication * )application supportedInterfaceOrientationsForWindow:( UIWindow * )window
{
if( __iPhone )
{
// Gets topmost/visible view controller
UIViewController * currentViewController = [ self topViewController ];
// Checks whether it implements rotation
if( [ currentViewController conformsToProtocol:@protocol( IRotationCapabilities ) ] )
{
// Unlock landscape view orientations for this view controller
return ( UIInterfaceOrientationMaskAllButUpsideDown );
}
// Allows only portrait orientation (standard behavior)
return ( UIInterfaceOrientationMaskPortrait );
}
else
{
// Unlock landscape view orientations for iPad
return ( UIInterfaceOrientationMaskAll );
}
}
Essayez d'implémenter cela dans votre UIViewController:
// implements the interface orientation (iOS 6.x)
@interface UINavigationController (RotationNone)
-(NSUInteger)supportedInterfaceOrientations;
@end
@implementation UINavigationController (RotationNone)
-(NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskPortrait;
}
@end
Je vois que quelqu'un a posé des questions à ce sujet dans Swift. Ce n'est pas immédiatement évident, car les méthodes Objective-C ne sont pas du tout des méthodes dans Swift, mais plutôt des variables calculées:
override var shouldAutorotate: Bool { return false }
override var supportedInterfaceOrientations: UIInterfaceOrientationMask { return .portrait }