Montrer UITabBar quand UIViewController poussé
Voici ma situation :
J'ai un UINavigationController
à l'intérieur d'un UITabBarController
. Quand je forer vers le bas de la manette de navigation, à un certain moment, j'ai à cacher la UITabBar
parce que je veux la vue de disposer d'autant d'espace que possible.
- Je le faire en utilisant self.hidesBottomBarWhenPushed = YES
à l'intérieur de la poussé UIViewController
, et il fonctionne très bien.
Cependant, je veux montrer la UITabBar
de retour dans la suite poussé les contrôleurs. J'ai essayé de mettre self.hidesBottomBarWhenPushed = NO
dans les autres contrôleurs, mais le UITabBar ne reviendra pas.
Il semble normal que les états de documentation :
hidesBottomBarWhenPushed
If YES, the bar at the bottom of the screen is hidden; otherwise, NO. If YES, the bottom bar remains hidden until the view controller is popped from the stack.
Et en effet, lorsque le contrôleur avec cette propriété a la valeur oui est sortie, la tabbar revient.
Est-il un bon moyen de montrer la UITabBar
quand un contrôleur est poussé, une fois qu'il a été caché?
Merci d'avance
OriginalL'auteur kombucha | 2011-02-21
Vous devez vous connecter pour publier un commentaire.
Bon, ici nous avons un bien long chemin à parcourir.
Pendant que vous lisez le document, le comportement par défaut est clair: une fois que la vue du contrôleur de
hides...
propriété est OUI, la barre d'onglet est masqué jusqu'à ce que le point de vue du contrôleur est sorti. Ce que vous voulez directement contredit cela, et pour diverses raisons, je voudrais tout d'abord vous recommandons de ne pas prendre cette approche.Toutefois, cela ne signifie pas qu'il est impossible à mettre en œuvre.
hides...
propriété NEVous ne pouvez pas modifier le comportement par défaut. Pour afficher la barre d'onglet, tous afficher les contrôleurs de la pile doivent définir leurs
hides...
propriété. Donc, à partir de la vue où la barre d'onglet est masqué, si vous souhaitez afficher la barre encore plus quand un nouveau point de vue est poussé, vous devez définir le mode d'affichage précédent du contrôleur dehides...
propriétéNO
de nouveau.Juste avant de pousser un nouveau point de vue contrôleur, définissez la propriété NO.
En faisant cela, vous aurez la barre d'onglet de nouveau. Cependant, vous reconnaîtrez la barre d'onglets est poussé par la gauche, tandis que la nouvelle vue est poussée à partir de la droite. Ce n'est clairement pas souhaitable, par conséquent, nous avons besoin de résoudre ce problème.
Le truc, c'est la valeur par défaut de la couche de l'action (l'animation) utilisé lors de l'onglet de la barre s'affiche de nouveau, est un push animation de transition à partir de la gauche. UITabBar implémente
- (id < CAAction >)actionForLayer:(CALayer *)layer forKey:(NSString *)key
méthode qui raconte à utiliser l'animation de la gauche pour le cas. Nous avons besoin de surcharger cette méthode, de retour d'une animation à partir de la droite à la place.Pour afficher la barre d'onglet en arrière, le Cacao modifie sa couche
position
de la propriété. Par conséquent, notre nouvelle méthode doit retourner une animation à partir de la droite pour la cléposition
, et pour toutes les autres touches, il doit utiliser la valeur par défaut de mise en œuvre. Notez que l'utilisation deposition
pour la barre d'onglet n'est pas documentée par Apple, il est donc sujet à changement sans préavis dans les versions suivantes. Nous sommes la mise en œuvre de quelque chose va à l'encontre d'Apple spécification de toute façon, ne peut donc pas se plaindre beaucoup.Cependant, vous ne pouvez pas utiliser de sous-classement de remplacer la méthode. Parce que même si vous avez une sous-classe personnalisée de UITabBar, vous ne pouvez pas modifier UITabBarController classe à l'utiliser au lieu de la valeur par défaut UITabBar.
Donc, il devient un peu plus complexe. Pour implanter votre propre logique de UITabBar classe, vous avez de "swap" de la mise en œuvre du message
actionForLayer: forKey:
.Tout d'abord, ajoutez une nouvelle méthode pour UITabBar classe à l'aide de la catégorie.
Et dans le
viewDidAppear
méthode de la barre d'onglet contrôleur, insérer les codes suivants.Que vous voulez faire dans
viewDidAppear
plutôt queviewDidLoad
, parce que sinon l'onglet de la barre de glisser de la droite dans le premier temps de l'application s'affiche.Maintenant, quand un UITabBar instance reçoit un message
actionsForLayer forKey:
, la méthode personnaliséecustomActionForLayer forKey:
est invoquée. Il intercepte la cléposition
, et renvoie une animation à partir de la droite. Si c'est pour une autre touche, elle appelle la mise en œuvre d'origine du message, qui est maintenant connecté au messagedefaultActionsForLayer forKey:
.Ok, nous y sommes. Rappelez-vous quand popping retour à la vue, vous pouvez avoir à définir l'
hides...
propriété OUI, parce que vous le réglez PAS lorsque l'on pousse un nouveau point de vue (et faire un peu similaire astuces pour animer correctement).J'ai passé un peu de temps sur ce sujet, mais paradoxalement, je dois dire que *Ne pas utiliser ce à nouveau, car il utilise une sans-papiers de l'information de Cacao classes ("position" pour l'onglet de la barre de l'animation), en contradiction avec les documentée des comportements et de l'est à l'encontre d'Apple de l'homme de l'interface de ligne directrice. Il se peut que votre application ne fonctionne pas de même avec les versions du SDK suivantes, que les utilisateurs ne peuvent pas facilement adopter l'interface, ou même qu'Apple refuse votre application sur l'App store.
Alors que sur la terre est ma réponse? Eh bien, un exemple de quelques sujets intéressants sur le développement iOS, je suppose (et une preuve montrant que je suis terriblement improductives aujourd'hui :P).
hidesBottomBarWhenPushed
, ou simplement afficher les boutons de la barre d'outils de l'ailleurs....OriginalL'auteur MHC
hidesBottomBarWhenPushed n'est pas déconseillée.
Je trouve qu'il est très simple à réaliser les masquer et afficher des UITabBar à l'aide de la méthode suivante:
Donc, juste après que vous appuyez sur le detailViewConroller, vous devez réinitialiser la propriété masquer retour à PAS.
De cette manière, il sera de nouveau apparaître lors de l'affichage de pop de retour.
pas besoin de tout changement supplémentaire dans viewWillApear/disparaître,etc..
Profitez de.
Votre solution semble fonctionner pour moi mais il y a encore un problème. J'ai beaucoup d'écrans où vous pouvez naviguer trop. Afin d'écrire le même code partout n'est pas possible. Pourriez-vous expliquer pourquoi ce hack fonctionne? Merci!
Je vous suggère de créer une sous-classe de UINavigationController et le mettre sur tous vos manette de navigation du type. Dans la mise en oeuvre de remplacer la méthode suivante:
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated { viewController.hidesBottomBarWhenPushed = YES; [super pushViewController:viewController animated:animated]; }
Désormais, à chaque fois que vous poussez un nouveau VC, il va se cacher la TabBar.OriginalL'auteur AmitP
Voici mon approche avec les story-boards en iOS 5:
Définir la
hidesBottomBarWhenPushed
propriétéNO
avant d'effectuer le pousser segue:La séquence identifiant est évidemment à vous de nom.
Définir à
YES
immédiatement lors de l'affichage du contrôleur de la vue disparaît:Fonctionne comme un charme (testé sur iOS 5.1) à l'aide de toutes les bonnes animations pour les
UITabBar
.OriginalL'auteur Michael Thiel