web-dev-qa-db-fra.com

Masquer la barre de tabulation et supprimer l'espace

Existe-t-il un moyen de masquer la barre de tabulation et de supprimer cet espace (environ 50 pixels)?

J'ai essayé 

self.tabBarController?.tabBar.hidden = true
self.extendedLayoutIncludesOpaqueBars = true

Pas de chance. Je vois un espace vide.

32
Utku Dalmaz

Si vous voyez toujours une bande noire sous la barre d’onglet masquée, avez-vous essayé de sélectionner Étendre les bords sous les barres opaques ici?

 enter image description here

Assurez-vous également que Sous barres inférieures est toujours sélectionné. J'espère que ça aide!

46
Smnd

Swift 3 :

extension UITabBarController {
    func setTabBarVisible(visible:Bool, duration: TimeInterval, animated:Bool) {
        if (tabBarIsVisible() == visible) { return }
        let frame = self.tabBar.frame
        let height = frame.size.height
        let offsetY = (visible ? -height : height)

        // animation
        UIViewPropertyAnimator(duration: duration, curve: .linear) {
            self.tabBar.frame.offsetBy(dx:0, dy:offsetY)
            self.view.frame = CGRect(x:0,y:0,width: self.view.frame.width, height: self.view.frame.height + offsetY)
            self.view.setNeedsDisplay()
            self.view.layoutIfNeeded()
        }.startAnimation()
    }

    func tabBarIsVisible() ->Bool {
        return self.tabBar.frame.Origin.y < UIScreen.main.bounds.height
    }
}

Pour utiliser (si par exemple self est une UITabBarController):

self.setTabBarVisible(visible: false, duration: 0.3, animated: true)

Swift 2.x:

extension UITabBarController {
    func setTabBarVisible(visible:Bool, duration: NSTimeInterval, animated:Bool) {
        if (tabBarIsVisible() == visible) { return }
        let frame = self.tabBar.frame
        let height = frame.size.height
        let offsetY = (visible ? -height : height)

        // animation
        UIView.animateWithDuration(animated ? duration : 0.0) {
            self.tabBar.frame = CGRectOffset(frame, 0, offsetY)
            self.view.frame = CGRectMake(0, 0, self.view.frame.width, self.view.frame.height + offsetY)
            self.view.setNeedsDisplay()
            self.view.layoutIfNeeded()
        }
    }

    func tabBarIsVisible() ->Bool {
        return self.tabBar.frame.Origin.y < UIScreen.mainScreen().bounds.height
    }
}

Utiliser:

self.tabBarController?.setTabBarVisible(visible: false, duration: 0.3, animated: true)
31

Après avoir vu votre capture d'écran en commentaire. Je pense que vous pouvez essayer de définir hidesBottomBarWhenPushed sur true.

hidesBottomBarWhenPushed = true

Ou storyboard.

 enter image description here

Elle masquera automatiquement la barre inférieure lorsque vous appuierez sur un autre contrôleur de vue et la reverret lorsque vous revenez.

22
JZAU

NOTE - Cette solution consiste simplement à supprimer l’espace blanc après avoir caché la barre de tabulation. 

Pour masquer la barre de tabulation, la meilleure solution est - @Michael Campsall répondez ici

La solution la plus simple consiste à modifier les contraintes de fond de votre vue (dans mon cas, son tableau), au lieu de définir des contraintes de fond avec BottomLayoutGuide. Captures d'écran ci-joint pour référence.

Les contraintes montrées dans les captures d'écran ci-dessous créent le problème, modifiez-les en fonction de la capture d'écran suivante.

 Change constraints shown in this screenshot according to below screenshot

Les contraintes réelles pour supprimer les espaces doivent être conformes à cette capture d'écran (ci-dessous).

 enter image description here

5
Ajay Kumar

La troisième réponse sur cette question fonctionne pour moi de la manière suivante:

Le code sur mon contrôleur de vue 

@IBAction func buttonPressed(sender: AnyObject) {

    setTabBarVisible(!tabBarIsVisible(), animated: true)

}

func setTabBarVisible(visible: Bool, animated: Bool) {
    // hide tab bar
    let frame = self.tabBarController?.tabBar.frame
    let height = frame?.size.height
    var offsetY = (visible ? -height! : height)
    print ("offsetY = \(offsetY)")

    // zero duration means no animation
    let duration:NSTimeInterval = (animated ? 0.3 : 0.0)

    // animate tabBar
    if frame != nil {
        UIView.animateWithDuration(duration) {
            self.tabBarController?.tabBar.frame = CGRectOffset(frame!, 0, offsetY!)
            self.view.frame = CGRectMake(0, 0, self.view.frame.width, self.view.frame.height + offsetY!)
            self.view.setNeedsDisplay()
            self.view.layoutIfNeeded()
            return
        }
    }
}



func tabBarIsVisible() -> Bool {
    return self.tabBarController?.tabBar.frame.Origin.y < UIScreen.mainScreen().bounds.height
}

Dans le storyboard:

La couleur d'arrière-plan de la vue principale du contrôleur de vue est la couleur noire:  enter image description here

Ensuite, vous pouvez avoir une autre vue à l'intérieur (couleur d'arrière-plan blanche), un espace de fuite suivi et délimité par des espaces à superview ainsi que des espaces supérieur et inférieur par rapport au guide de disposition. 

 enter image description here

Et le résultat est:

 enter image description here

3
valencieu

Par programme, ajoutez ceci au prochain contrôleur de vue pour Swift 4.

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    tabBarController?.tabBar.isHidden = true
    edgesForExtendedLayout = UIRectEdge.bottom
    extendedLayoutIncludesOpaqueBars = true
}

Et ajouter une couleur de fond

2
Itumeleng Mabote

Ma méthode préférée consiste à utiliser un contrôleur d’emballage. Si je veux masquer la barre d'onglets, j'augmente simplement la hauteur du contrôleur de barre d'onglets. Ainsi, la barre d'onglets est déplacée hors de l'écran.

Avec cette solution, vous n'avez pas besoin de pirater le cadre de la barre d'onglets et vous ne dépendez pas de l'animation Push du contrôleur de navigation:

import UIKit

class ViewController: UIViewController {
    let tabController: UITabBarController = {
        let tabController = UITabBarController()
        // setup your tabbar controller here

        return tabController;
    }()

    var tabbarHidden = false {
        didSet {
            var frame = self.view.bounds;

            if (tabbarHidden) {
                frame.size.height += self.tabController.tabBar.bounds.size.height;
            }

            self.tabController.view.frame = frame;
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        // add the tab controller as child controller
        addChildViewController(self.tabController)
        self.tabController.view.frame = self.view.bounds
        self.tabController.view.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
        self.view.addSubview(self.tabController.view)
        self.tabController.didMoveToParentViewController(self)

        // for debugging
        let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(switchTabbar))
        self.tabController.view.addGestureRecognizer(tapRecognizer)
    }

    override func childViewControllerForStatusBarStyle() -> UIViewController? {
        return self.tabController
    }

    override func childViewControllerForStatusBarHidden() -> UIViewController? {
        return self.tabController
    }

    func switchTabbar() {
        UIView.animateWithDuration(0.3) {
            self.tabbarHidden = !self.tabbarHidden
        }
    }
}

 enter image description here

2
Sulthan

Oui. Vous pouvez masquer votre barre d’onglet lorsque vous appuyez pour afficher le contrôleur. Vous pouvez afficher la barre d'onglets chez vous. Vous pouvez masquer votre barre d'onglets lorsque vous appuyez sur le contrôleur View suivant.

Reportez-vous à l'image suivante Hide Botton Bar sur Push et définissez tous les contrôleurs de vues pour lesquels vous ne souhaitez pas utiliser la barre d'onglets.

 enter image description here

J'espère que ça aide..

1

Pour ceux qui aiment tout faire par programme, ajoutez cette ligne à la méthode init d'un ViewController qui ne devrait pas avoir le tabBar:

hidesBottomBarWhenPushed = true
1
budidino

Parfois, le moyen le plus simple consiste simplement à ajouter une vue utilisant les limites de UIScreen. 

let whiteView = UIView()
    whiteView.backgroundColor = .white
    view.addSubview(whiteView)
    whiteView.translatesAutoresizingMaskIntoConstraints = false
    whiteView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
    whiteView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
    whiteView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
    whiteView.heightAnchor.constraint(equalToConstant: UIScreen.main.bounds.height).isActive = true

Parfois, les bords de la vue dépassent la barre de navigation, ce qui vous pose de nouveaux problèmes si vous étendez la disposition de la vue. 

0
Itumeleng Mabote

Ce code fonctionne sur iOS 10, 11 et iPhone X (simulateurs compris) pour afficher/masquer la barre de tabulation . Je l'ai créé plusieurs années (période iOS 7?) Et il fonctionne de manière fiable depuis ce temps. 

Cela fonctionne très bien sur iPhone X tant que le contenu de vos contrôles childViewControllers (dans des onglets) est épinglé sur topLayoutGuide, bottomLayoutGuide ou SafeArea et non les murs principaux. Ensuite, tout fonctionne. Prendre plaisir!

@interface UITabBarController (HideTabBar)
@property (nonatomic, getter=isTabBarHidden) BOOL tabBarHidden;
-(void)setTabBarHidden:(BOOL)hidden animated:(BOOL)animated;
@end

@implementation UITabBarController (HideTabBar)
-(BOOL)isTabBarHidden
{
    CGRect viewFrame = self.view.frame;
    CGRect tabBarFrame = self.tabBar.frame;
    return tabBarFrame.Origin.y >= viewFrame.size.height;
}

-(void)setTabBarHidden:(BOOL)hidden
{
    [self setTabBarHidden:hidden animated:NO];
}

-(void)setTabBarHidden:(BOOL)hidden animated:(BOOL)animated
{
    BOOL isHidden = self.tabBarHidden;    
    if(hidden == isHidden)return;

    UIView *transitionView = [[[self.view.subviews reverseObjectEnumerator] allObjects] lastObject];
    if(transitionView == nil) {
        NSLog(@"UITabBarCategory can't get the container view");
        return;
    }    
    CGRect viewFrame = self.view.bounds;
    CGRect tabBarFrame = self.tabBar.frame;
    CGRect containerFrame = transitionView.frame;
    CGRect selectedVCFrame = containerFrame;

    tabBarFrame.Origin.y = viewFrame.size.height - (hidden ? 0 : tabBarFrame.size.height);
    containerFrame.size.height = viewFrame.size.height - (hidden ? 0 : tabBarFrame.size.height);
    if([self.moreNavigationController.viewControllers containsObject:self.selectedViewController]) {
        selectedVCFrame = self.selectedViewController.view.frame;
        selectedVCFrame.size.height += hidden ? tabBarFrame.size.height : -tabBarFrame.size.height;
    }
    self.selectedViewController.view.frame = selectedVCFrame;

    [UIView animateWithDuration:.5 animations:^{
        self.tabBar.frame = tabBarFrame;
        transitionView.frame = containerFrame;
        [self.selectedViewController.view setNeedsLayout];
    }];
}
@end

Utilisation - Je l'appelle dans viewController lors d'événements de rotation comme suit:

-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
    [super didRotateFromInterfaceOrientation:fromInterfaceOrientation];

    // Hide TabBar on iPhone, iPod Touch
    if([UIDevice currentDevice].userInterfaceIdiom != UIUserInterfaceIdiomPad) {
        if(_startDateEditor.editing) return;
        if(fromInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown || fromInterfaceOrientation == UIInterfaceOrientationPortrait)
            [self.tabBarController setTabBarHidden:YES animated:YES];
        else
            [self.tabBarController setTabBarHidden:NO animated:YES];
    }
}
0
Cliff Ribaudo