Rotation automatique d'une seule UIViewController dans iOS 6 avec UITabBar

j'ai une application qui fonctionne uniquement dans les Portrait Mode, mais il y a une vue unique qui peut afficher la vidéo, donc je veux que cette vue fonctionne aussi dans le landscape mode, mais dans iOS 6, je ne peux pas comprendre comment je peux le faire, maintenant j'ai ceci:

In 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 la vue que j'ai à faire ceci:

- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskAll;
}

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

donc j'insère le code ci-dessus, seulement dans mon UIViewController que je veux l'utiliser aussi dans le paysage, mais ne fonctionne pas, quelqu'un sait comment je peux faire? je veux juste l'autorotate quand montre la vidéo.

25
demandé sur Bartłomiej Semańczyk 2012-09-23 13:40:51
la source

3 ответов

tout d'abord, vos paramètres cibles devraient ressembler à ceci:: Supported Interface Orientations

In 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;
}

à l'Intérieur de votre ViewController:

a) si vous ne voulez pas tourner:

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

- (BOOL)shouldAutorotate
{
    return NO;
}

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

b) Si vous voulez tourner vers le paysage:

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

- (BOOL)shouldAutorotate
{
    return YES;
}

- (NSInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskAllButUpsideDown;
}

Edit:

une autre solution consiste à implémenter cette méthode à L'intérieur D'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
répondu mientus 2012-10-20 16:19:35
la source

je voudrais écrire un commentaire mais je ne peux pas, donc je poste cela comme une réponse.

C'était mon scénario :

mon app prend en charge l'orientation changeant seulement sur certaines vues et je ne pouvais pas comprendre comment le faire juste pour ceux que je voulais, puis j'ai atterri à cette question et vu la réponse de mientus (Merci pour cela) puis je suis allé de l'avant et a fait ce qu'il a suggéré qui était la sous-classe UITabBarController et de passer outre 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 vue contrôleur j'aurais les méthodes pour indiquer si je voulais la rotation ou non. Les méthodes dans UITabBarController étaient appelées mais pas celles dans mon viewcontroller donc la rotation se passait toujours là où je ne voulais pas. Ensuite je sous-classe UINavigationController et j'annule les mêmes méthodes seulement avec ce changement sur l'interfaceorientation supportée pour ressembler à 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 essentiellement, il obtient le contrôleur de vue courant et puis demande l'orientation soutenue et voilà mes méthodes dans mon viewcontroller sont appelées et je peux gérer l'orientation où je le veux.

3
répondu Oscar Salvador 2013-11-11 21:25:33
la source

est-ce que la vue que vous voulez faire tourner est une vue partielle de la vue portrait seulement? Voir habituellement le comportement de rotation hérite de rootviewcontroller. Puis si vous retournez non dans shouldAutorotate dans rootviewcontroller vous arrêtez la rotation dans chaque sous-vue simple.

je suggère de diviser votre architecture de cette façon:

rootViewController -> supportedInterfaceOrientations = Portrait & shouldAutorotate = YES NORotationViewControllers - > supported interfaceorientations = Portrait & shouldAutorotate = Oui rotationViewControllers - > supportedInterfaceOrientations = All & shouldAutorotate = YES

si vous ne l'avez pas encore lu, regardez: Prise En Charge De Plusieurs Interface Orientations

0
répondu Beppe 2012-09-23 14:48:35
la source