76 votes

Comment masquer le uitabbarcontroller ?

J'ai un problème avec UITabBarController . Dans mon application, je veux le cacher mais sans utiliser hidesBottomBarWhenPushed parce que je veux le cacher, pas quand je le pousse. Par exemple, je veux le masquer lorsque j'appuie sur un bouton "Masquer" dans mon application.

J'ai lu beaucoup d'articles dans Google mais je ne trouve pas comment faire.

0 votes

149voto

Saurabh Points 14221

Je colle ceci à partir de mon code de travail ... vous pouvez appeler ces méthodes pour masquer et afficher le tabbarcontroller.... juste passer l'instance de tabbarcontroller à ces fonctions ...

// Method call
[self hideTabBar:self.tabBarController];   

// Method implementations
- (void)hideTabBar:(UITabBarController *) tabbarcontroller
{
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.5];

    for(UIView *view in tabbarcontroller.view.subviews)
    {
        if([view isKindOfClass:[UITabBar class]])
        {
            [view setFrame:CGRectMake(view.frame.origin.x, 480, view.frame.size.width, view.frame.size.height)];
        } 
        else 
        {
            [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, 480)];
        }
    }

    [UIView commitAnimations];   
}

- (void)showTabBar:(UITabBarController *) tabbarcontroller
{       
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.5];
    for(UIView *view in tabbarcontroller.view.subviews)
    {
        NSLog(@"%@", view);

        if([view isKindOfClass:[UITabBar class]])
        {
            [view setFrame:CGRectMake(view.frame.origin.x, 431, view.frame.size.width, view.frame.size.height)];

        } 
        else 
        {
            [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, 431)];
        }
    }

    [UIView commitAnimations]; 
}

0 votes

Apple vous permet-il de le faire ? Je veux dire, la barre de tabulation devrait être en lecture seule Je me demande juste si mon application va être rejetée.

3 votes

Je suis en train d'essayer cette solution. Lorsque j'appelle la méthode hideTabbar(), ma barre d'onglets est masquée mais elle montre un espace noir en bas (position de la même barre d'onglets). Comment puis-je corriger cela ?

58voto

karlbecker_com Points 742

J'ai modifié la réponse de Setomidor pour qu'elle fonctionne à la fois en mode paysage, portrait et sur l'iPad (les valeurs 320 et 480 ne fonctionnent que sur l'iPhone).

- (void) hideTabBar:(UITabBarController *) tabbarcontroller 
{
    CGRect screenRect = [[UIScreen mainScreen] bounds];

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.5];
    float fHeight = screenRect.size.height;
    if(  UIDeviceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation) )
    {
        fHeight = screenRect.size.width;
    }

    for(UIView *view in tabbarcontroller.view.subviews)
    {
        if([view isKindOfClass:[UITabBar class]])
        {
            [view setFrame:CGRectMake(view.frame.origin.x, fHeight, view.frame.size.width, view.frame.size.height)];
        } 
        else 
        {
            [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, fHeight)];
            view.backgroundColor = [UIColor blackColor];
        }
    }
    [UIView commitAnimations];
}

- (void) showTabBar:(UITabBarController *) tabbarcontroller 
{   
    CGRect screenRect = [[UIScreen mainScreen] bounds];
    float fHeight = screenRect.size.height - tabbarcontroller.tabBar.frame.size.height;

    if(  UIDeviceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation) )
    {
        fHeight = screenRect.size.width - tabbarcontroller.tabBar.frame.size.height;
    }

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.5];
    for(UIView *view in tabbarcontroller.view.subviews)
    {   
        if([view isKindOfClass:[UITabBar class]])
        {
            [view setFrame:CGRectMake(view.frame.origin.x, fHeight, view.frame.size.width, view.frame.size.height)];            
        } 
        else 
        {
            [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, fHeight)];
        }       
    }
    [UIView commitAnimations]; 
}

Nous avons également modifié le code pour gérer les changements introduits dans iOS 6 avec le changement d'orientation de UIDevice et nous assurer qu'il fonctionne correctement même lorsque l'appareil est couché sur le dos.

10 votes

Vous devez remplacer - 49.0 con tabbarcontroller.tabBar.frame.size.height pour un code plus propre qui a moins de chance de se casser dans les futures versions d'iOS.

34voto

Sailesh Points 3535

Dans votre méthode d'action pour le bouton :

[self.tabBarController.tabBar setHidden:YES];

2 votes

Cette méthode fonctionne sous iOS 7, mais sous iOS 6, elle laisse un grand vide à l'endroit où se trouvait la barre de tabulation.

0 votes

Pour moi, sous iOS 13.3, cela ne fonctionne pas - il disparaît, mais laisse un espace vide.

0 votes

Avez-vous essayé les "underOpaqueBars" et autres "under stuffs" dans les informations du contrôleur de vue ?

12voto

Thomas Verbeek Points 476

Les solutions de Saurahb et de karlbecker_com sont excellentes, bien qu'elles puissent provoquer un effet d'éclatement évident lorsque la vue contient un élément de type aperçu de la table pendant que la barre d'onglets s'anime à nouveau. J'ai fait quelques modifications et l'ai combiné en une seule fonction (comme une catégorie sur UITabBarController). Ce n'est pas complètement parfait (animation de correction retardée) mais donne de bons résultats avec les tableaux.

Si vous aimez les blocs d'animation et les catégories, faites-en l'essai. Orientable et compatible avec les appareils.

UITabBarController+ShowHideBar.m :

#import "UITabBarController+ShowHideBar.h"

@implementation UITabBarController (ShowHideBar)

- (void) setHidden:(BOOL)hidden{

    CGRect screenRect = [[UIScreen mainScreen] bounds];
    float fHeight = screenRect.size.height;
    if(  UIDeviceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation) ){
        fHeight = screenRect.size.width;
    }

    if(!hidden) fHeight -= self.tabBar.frame.size.height;

    [UIView animateWithDuration:0.25 animations:^{
        for(UIView *view in self.view.subviews){
            if([view isKindOfClass:[UITabBar class]]){
                [view setFrame:CGRectMake(view.frame.origin.x, fHeight, view.frame.size.width, view.frame.size.height)];
            }else{
                if(hidden) [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, fHeight)];
            }
        }
    }completion:^(BOOL finished){
        if(!hidden){

            [UIView animateWithDuration:0.25 animations:^{

                for(UIView *view in self.view.subviews)
                {
                    if(![view isKindOfClass:[UITabBar class]])
                        [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, fHeight)];
                }

            }];
        }
    }];

}

@end

UITabBarController+ShowHideBar.h :

#import <UIKit/UIKit.h>

@interface UITabBarController (ShowHideBar)

- (void) setHidden:(BOOL)hidden;

@end

Utilisation :

[self.tabBarController setHidden:YES];
[self.tabBarController setHidden:NO];

9voto

Setomidor Points 613

La réponse de Saurabh ci-dessus peut être étendue pour fonctionner également en orientation paysage :

+ (void) hideTabBar:(UITabBarController *) tabbarcontroller {

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.5];

    //Support for landscape views
    int orientation = [[UIDevice currentDevice] orientation];
    int x_pos = 480;
    if (orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight) {
        x_pos = 320;
    }

    for(UIView *view in tabbarcontroller.view.subviews)
    {
        if([view isKindOfClass:[UITabBar class]])
        {
            [view setFrame:CGRectMake(view.frame.origin.x, x_pos, view.frame.size.width, view.frame.size.height)];
        } 
        else 
        {
            [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, x_pos)];
        }       
    }   
    [UIView commitAnimations]; 
}

`

Les numéros x_pos correspondants pour showTabBar() sont les suivants 431 y 271 .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X