2009-08-19 5 views
5

J'utilise un UINavigationController (note de côté: à l'intérieur d'un UITabBar) qui vous donne par défaut un UINavigationBar en haut. Si je masque la barre via IB, la barre n'est pas seulement passée à la racine UIViewController mais aussi à tous les contrôleurs que je pousse sur la pile. Ne me laissant aucun moyen (automatique) de revenir en arrière. Donc, comment cacher UINavigtionBar seulement sur le UIViewController racine. Activer/désactiver "navigationBarHidden" temporairement ne fonctionne pas car cela semble gênant avec l'animation.Masquage de UINavigationBar uniquement pour la racine UIViewController

D'autres idées?

+0

La réponse n'est pas exactement ce que j'étais après mais juste assez. – tcurdt

Répondre

5

En fait, je couru dans ce problème, comment je l'ai résolu était avec le délégué UINavigationController, j'ai essentiellement une sous-classe de UINavigationController et en a fait son propre délégué, alors je mis en œuvre la méthode

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
    if([viewController isKindOfClass: [SomeClass class]]) 
     [self setNavigationBarHidden: NO]; 
    else 
     [self setNavigationBarHidden: YES]; 
} 

Alors vous demandez qui classe c'est et si c'est celui qui doit avoir une navigationBar vous le montrez, cela a fonctionné pour moi plutôt bien ... j'espère que ça aide

+0

C'est aussi ce que j'ai essayé. Mais cela laissera la barre apparaître juste sur l'écran et pas seulement sur la vue qui s'anime dedans. Certainement devrait être bien sans animation. Mais je veux l'animation. – tcurdt

+0

?? Que voulez-vous dire? C'est sur l'écran là sûr, mais il n'apparaît que lorsque vous appuyez sur la vue dont vous avez besoin, même si son animation ... quel est le problème? – Daniel

+0

Si vous ne voulez pas que l'animation de la barre elle-même, vous pouvez écrire le même code dans la - navigationController: didShowViewController: animated: méthode à la place, de sorte qu'il apparaît seulement après que la vue est poussée .. – Daniel

0

Mon idée serait de pas faire de votre première vue une partie du contrôleur de navigation. Avoir un TableViewController simple, par exemple, et puis quand vous voulez descendre, créez le UINavigationController, et poussez l'affichage manuellement.

Je n'ai pas essayé ceci et je ne sais pas si cela fonctionnera, cependant. Juste une idée à essayer.

+0

Malheureusement, cela ne fonctionne pas car le contrôleur racine n'a pas de bouton de retour. – tcurdt

+0

Je me demandais si je pouvais le faire et * ajouter * un bouton sur la gauche à l'UINavigationBar. Je vais devoir essayer (bien que je sois allé un chemin différent à la place pour l'instant) – tcurdt

0

Vous avez plusieurs façons différentes de le faire. Le fait que vous soyez intégré dans un contrôleur UITAbBar complique considérablement ceci parce qu'il n'y a aucun moyen de différencier si viewDidAppear: est appelé en raison du contrôleur poussé ou de l'échange de tabulation, ce qui signifie que vous devrez peut-être stocker des données pour savoir provoque la transition et si vous avez besoin de cacher la barre ou non. En supposant que vous manipuliez cela, une option est de changer navigationBarHidden après votre animation. À la sortie, il n'y a pas de bon endroit pour gérer cela puisque vous voulez que l'animation pop se produise après l'animation de la barre. La solution la plus rapide consiste à masquer la barre puis à faire tourner manuellement votre runloop pendant ~ 0,5 seconde jusqu'à ce qu'il s'anime, puis continuez. C'est dégueulasse mais c'est rapide et ça marche.

- (void)viewWillDisappear:(BOOL)animated { 
    if (animated) { 
    [self.navigationController.navigationBar setHidden:YES animated:YES]; 
    } 

    //GROSS 
    NSDate *endDate = [NSDate dateWithTimeIntervalSinceNow:0.5]; 
    while([[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:endDate]); 
} 

Si vous voulez le faire proprement, je recommande de réimplémenter UINavigationController à partir de zéro.

+0

Vous n'avez pas besoin de mettre en œuvre quoi que ce soit à partir de rien, simplement sous-classe UINavigationController sera sufice, consultez ma réponse. – Daniel

+0

Vous pouvez le faire, mais en fonction de ce que vous faites, vous aurez beaucoup d'interactions problématiques avec les autres animations programmées par UINavigationController car elles seront toutes commitées en même temps et vous n'avez aucun contrôle sur elles.Je l'ai fait de cette façon dans le passé, mais dès que je voulais faire autre chose (comme les transitions personnalisées), il se désintègre, et il dépend totalement du timing interne de la façon dont UINavigaitionController planifie ses animations. –

8

Pour moi, la façon la plus simple d'éviter l'espace blanc après avoir caché le UInavigationBar est de cacher ou montrez votre UInaviagtionBar comme suit.

-(void)viewWillDisappear:(BOOL)animated 
{ 
    [super viewDidDisappear:animated]; 
    [self.navigationController setNavigationBarHidden:NO animated:YES]; 
} 
-(void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    [self.navigationController setNavigationBarHidden:YES animated:YES]; 
} 

avec la syntaxe: self.navigationController.navigationBarHidden = YES; j'ai toujours l'espace blanc.

+0

I J'utilise approche et ça marche bien pour moi – CVertex

Questions connexes