Question

I ai un UITabBarController, et chaque patte traite un autre UIViewController qui pousse sur la pile de nouveaux contrôleurs selon les besoins. Dans deux de ces onglets dont j'ai besoin, lorsque vous avez atteint un contrôleur spécifique, la possibilité de faire pivoter l'iPhone et de visualiser une vue en mode paysage. Après avoir lutté beaucoup, j'ai trouvé qu'il est obligatoire de passer outre subclassing UITabBarController shouldAutorotateToInterfaceOrientation. Cependant, si je retourne simplement OUI dans la mise en œuvre, l'effet secondaire indésirable suivant se pose:

chaque contrôleur dans chaque onglet est automatiquement mis en mode paysage lors de la rotation de l'iPhone.

shouldAutorotateToInterfaceOrientation Même primordial dans chaque contrôleur pour revenir NO ne fonctionne pas. Lorsque l'iPhone est mis en rotation, le contrôleur est mis en mode paysage

Je shouldAutorotateToInterfaceOrientation mis en œuvre comme suit dans le UITabBarController sous-classé:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    if([self selectedIndex] == 0 || [self selectedIndex] == 3)
        return YES;

    return NO;
}

Alors que seuls les deux onglets Je suis intéressé réellement obtenir de l'aide pour le mode paysage. Y at-il un moyen de soutenir le mode paysage pour un contrôleur spécifique sur la pile d'un onglet particulier?

J'ai essayé, sans succès, quelque chose comme

(BOOL) shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation) interfaceOrientation {

if([self selectedIndex] == 0 || [self selectedIndex] == 3)
{   
   if ([[self selectedViewController] isKindOfClass: [landscapeModeViewController class]])
           return YES;
    }

     return NO;

}

En outre, j'ai essayé d'utiliser la méthode délégué didSelectViewController, sans succès. Toute aide est grandement appréciée. Merci.

Était-ce utile?

La solution

Cela a fonctionné pour moi:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    if(self.selectedIndex == 0 && [[[self.viewControllers objectAtIndex:0] visibleViewController] isKindOfClass:[MyViewController class]])
        return YES;
    else
        return NO;
}

Autres conseils

Voici une extension UITabBarController que les délégués appels à shouldAutorotateToInterfaceOrientation au contrôleur de l'enfant sélectionné. En utilisant cette extension, vous n'avez pas besoin de sous-classe UITabBarController plus et vous pouvez utiliser shouldAutorotateToInterfaceOrientation dans vos contrôleurs comme on peut s'y attendre.

UITabBarController + Autorotate.h:

#import <UIKit/UIKit.h>

@interface UITabBarController (Autorotate)
@end

UITabBarController + Autorotate.m:

#import "UITabBarController+Autorotate.h"

@implementation UITabBarController (Autorotate)

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    UIViewController *controller = self.selectedViewController;
    if ([controller isKindOfClass:[UINavigationController class]])
        controller = [(UINavigationController *)controller visibleViewController];
    return [controller shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}

@end

Je suis en mesure d'utiliser pendant un certain temps maintenant (du contrôleur de barre d'onglets de mon application) sans problème:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
     return [self.selectedViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}

De cette façon, dans le CV approprié, nous arrivons à faire de real vérifier, dans ce cas pour une galerie photo vue (what else?):

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Return YES for supported orientations
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

Mon point de vue de la galerie est même pas au haut de la pile pour un contrôleur de navigation donné. Il s'appelle encore.

Hélas, je viens de découvrir que ce ne pas si bien fonctionné lorsque le CV est tapi dans le MoreViewController (par opposition aux quatre onglets principaux). Dans ce cas, ma galerie VC ne sera jamais appelé. Je pense que c'est parce que le VC j'ai appelé tout est long vraiment le contrôleur de navigation de l'onglet sélectionné, qui puis les choses au propage VC approprié, dans ce cas, ma galerie photo VC. Mais pour le plus VC, les choses ne fonctionnent pas si bien ... Aaaand les choses vont en rotation en descente à partir de là. : \

J'ai essayé d'utiliser les modifications par Andreas (voir ailleurs dans ce fil), en vain. Clues sont les bienvenus!

Je suis tombé sur les mêmes questions que vous avez fait lorsque vous travaillez avec le UITabBarController. Je devais contrôler les UIViewControllers ont été autorisés à tourner et qui ne sont pas. Mon principal problème était avec l'onglet Plus. Je ne voulais pas des UIViewControllers inclus dans l'onglet Plus de tourner.

Ma solution était de créer ma propre UITabBarController que j'ai appelé MyTabBarController:

@interface MyTabBarController : UITabBarController <UITabBarDelegate> {

}

Ensuite, je mis en œuvre la méthode shouldAutorotateToInterfaceOrientation:

@implementation MyTabBarController

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
 UIViewController *controller = [self selectedViewController];

 if ((controller == [self moreNavigationController]) || ([self selectedIndex] == 4))
 {
  return interfaceOrientation == UIInterfaceOrientationPortrait;
 }

 return [controller shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}

@end

Je avais besoin de découvrir si l'onglet PLUS a été sélectionné. Ceci est un procédé en deux étapes; lorsque l'onglet PLUS est sélectionné au début de l'API renvoie un selectedIndex supérieur à 4 si je devais comparer le contrôleur sélectionné avec le moreNavigationController.

Si un UIViewController est sélectionné à partir de l'onglet Plus de la selectedIndex est enfin 4 mais le selectedController n'est pas plus le moreNavigationController mais le UIViewController sélectionné.

if ((contrôleur == ([self selectedIndex] == 4) [self moreNavigationController]) ||) se charge de cette question.

Maintenant, quand je lance mon application mes UIViewControllers dans l'onglet PLUS ne pivotent pas. J'espère que cela aidera d'autres développeurs qui exécutent dans les mêmes problèmes que moi.

Emilio

D'après ce que j'ai vu ici et d'ailleurs je l'ai cousu ensemble une solution qui utilise la méthode shouldAutorotate depuis l'ancien shouldAutorotateToInterfaceOrientation a été désapprouvée.

Je l'ai placé dans une catégorie à UITabBarController. J'espère donc que c'est admissible!

// call to method shouldAutorotate replaces call to method shouldAutorotateToInterfaceOrientation (deprecated)
-(BOOL)shouldAutorotate
{ // check whether selected view controller should autorotate    
  UIViewController *controller = self.selectedViewController;
  if ([controller isKindOfClass:[UINavigationController class]])
    { // in case it is a navigation controller: get visible view of that
      controller = [(UINavigationController *)controller visibleViewController];
    }
  return [controller shouldAutorotate];
}

Merci, Merci, Merci. Cela a été 2 jours à trouver comment faire. Voici mon avis sur l'ensemble de votre grande aide lorsque vous avez un tabBarController avec navigationControllers.

- (BOOL) shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation) interfaceOrientation {

UIViewController *controller = self.selectedViewController;
if ([controller isKindOfClass:[UINavigationController class]])
    controller = [(UINavigationController *)controller visibleViewController];

if([controller isKindOfClass:[LOCviewcontroller class]])
    return YES;
else
    if([controller isKindOfClass:[personWebSiteView class]])
        return YES;
else return NO; 

}

Toute critique d'un code de codeur neophite est toujours apprécié ... prise

Est-il vraiment OK sous-classe UITabBarController (comme suggéré ci-dessus dans la réponse acceptée)?

Je l'ai compris que les pommes dit quelque chose comme « vous devriez jamais sous-classe UITabBarController ou UINavigationController » - ou ai-je mal compris

Quoi qu'il en soit; J'ai trouvé ce tutoriel où ils un sous-classes UIViewController où ils ont mis un UITabBarController.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top