web-dev-qa-db-fra.com

Orientation de l'interface dans iOS 6.0

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.

25
user1302553

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;
}
19
uerceg

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

11
James Laurenstin

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;
}
7
Nicolas Miari

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.

2
user593733

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

1
Deji