web-dev-qa-db-fra.com

désactiver la rotation automatique sur un seul UIViewController dans iOS6

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 :)

19
Jesús Ayala

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;
}
35
GayleDDS

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

15
Jesús Ayala

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 );
    }
}
5
Christophe

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
4
zero3nna

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 }
0
Grimxn