web-dev-qa-db-fra.com

Autorotation d'un seul UIViewController dans iOS 6 avec UITabBar

J'ai une application qui fonctionne uniquement dans Portrait Mode, mais il existe une singleView qui peut afficher la vidéo. Je souhaite donc que cette vue fonctionne également dans le landscape mode, mais sous iOS 6, je ne vois pas comment je peux le faire. ce:

Dans AppDelegate.m j'ai:

self.window.rootViewController = myTabBar;

puis dans le résumé du projet:

enter image description here

et j'ai trouvé que dans iOS 6 pour détecter la rotation de vue, je dois le faire:

- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskAll;
}

// Tell the system It should autorotate
- (BOOL) shouldAutorotate {
return YES;
}

donc je n'insère le code ci-dessus que dans ma UIViewController que je souhaite utiliser également dans le paysage, mais cela ne fonctionne pas, quelqu'un sait comment je peux le faire? Je veux juste l'autorotation quand montrer la vidéo.

25
Piero

Premièrement, les paramètres de votre cible devraient ressembler à ceci: Supported Interface Orientations

Dans UITabBarController:

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // You do not need this method if you are not supporting earlier iOS Versions
    return [self.selectedViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}

-(NSUInteger)supportedInterfaceOrientations
{
    if (self.selectedViewController) 
        return [self.selectedViewController supportedInterfaceOrientations];

    return UIInterfaceOrientationMaskPortrait;
}

-(BOOL)shouldAutorotate
{
    return YES;
}

Dans votre ViewController:

a) si vous ne voulez pas faire la rotation:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

- (BOOL)shouldAutorotate
{
    return NO;
}

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

b) si vous voulez faire pivoter en paysage:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return YES;
}

- (BOOL)shouldAutorotate
{
    return YES;
}

- (NSInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskAllButUpsideDown;
}

Modifier:

Une autre solution consiste à implémenter cette méthode dans AppDelegate:

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
    NSUInteger orientations = UIInterfaceOrientationMaskAll;

    if (self.window.rootViewController) {
        UIViewController* presented = [[(UINavigationController *)self.window.rootViewController viewControllers] lastObject];
        orientations = [presented supportedInterfaceOrientations];
    }
    return orientations; 
}
49
mientus

J'écrirais un commentaire mais je ne peux pas, alors je poste ceci comme réponse. 

C'était mon scénario:

Mon application prend en charge l'orientation changeante uniquement sur certains points de vue et je ne savais pas comment le faire uniquement pour ceux que je voulais, puis j'ai atterri à cette question et j'ai vu la réponse de Mientus (Merci pour cela), puis j'ai poursuivi il a suggéré de définir la sous-classe UITabBarController et de remplacer ces méthodes:

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{

    NSLog(@"AUTO ROTATE IN CUSTOM TAB BAR");
    // You do not need this method if you are not supporting earlier iOS Versions
    return [self.selectedViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}


-(NSUInteger)supportedInterfaceOrientations{

    NSLog(@"supportedInterfaceOrientations IN CUSTOM TAB BAR");

    if (self.selectedViewController)
        return [self.selectedViewController supportedInterfaceOrientations];

    return UIInterfaceOrientationMaskPortrait;
}

-(BOOL)shouldAutorotate{

    NSLog(@"shouldAutorotate IN CUSTOM TAB BAR");
    return [self.selectedViewController shouldAutorotate];
}

puis à l’intérieur de chaque contrôleur de vue, j’aurais les méthodes pour indiquer si je voulais ou non faire la rotation. Les méthodes de UITabBarController étaient appelées, mais pas celles de mon contrôleur de vue; par conséquent, la rotation se produisait toujours là où je ne voulais pas. Ensuite, je sous-classe UINavigationController et substitue les mêmes méthodes uniquement avec cette modification sur celle prise en charge par InterInterfaceOrientation qui ressemble à ceci:

- (NSUInteger)supportedInterfaceOrientations{

NSLog(@"supportedInterfaceOrientations IN CUSTOM NAV BAR CALLING CURRENT VIEW CONTROLLER");
UIViewController* presented = [[self viewControllers] lastObject];
return [presented supportedInterfaceOrientations];

}

ce que cela fait en gros, il obtient le contrôleur de vue actuel, puis demande l’orientation prise en charge et voila mes méthodes dans mon contrôleur de vue sont appelées et je peux gérer l’orientation où je le souhaite.

3
Oscar Salvador

La vue que vous souhaitez faire pivoter est-elle une sous-vue de la vue en mode portrait uniquement? Généralement, le comportement de rotation des vues hérite de rootviewcontroller. Ensuite, si vous renvoyez NO dans shouldAutorotate dans rootviewcontroller, vous arrêtez la rotation dans chaque aperçu.

Je suggère de scinder votre architecture de cette façon:

rootViewController -> supportedInterfaceOrientations = Portrait & shouldAutorotate = YES NORotationViewControllers -> supportedInterfaceOrientations = Portrait & shouldAutorotate = YES rotationViewControllers -> supportedInterfaceOrientations = Tout & shouldAutorotate = YES

Si vous ne l'avez pas déjà lu, regardez: Prise en charge de plusieurs orientations d'interface

0
Beppe