Comment masquer la barre d'tabs avec animation dans iOS?

J'ai donc un button qui est connecté à un IBAction. Lorsque j'appuie sur le button, je veux masquer la barre d'tabs dans mon application iOS avec une animation. Ceci [self setTabBarHidden:hidden animated:NO]; ou ceci [self.tabBarController setTabBarHidden:hidden animated:YES]; ne marche pas. C'est mon code sans l'animation:

 - (IBAction)picture1:(id)sender { [self.tabBarController.tabBar setHidden:YES]; } 

Toute aide serait grandement appréciée: D

    J'essaie de garder les animations de vue à ma disposition en utilisant la formule suivante:

     // pass a param to describe the state change, an animated flag and a completion block matching UIView animations completion - (void)setTabBarVisible:(BOOL)visible animated:(BOOL)animated completion:(void (^)(BOOL))completion { // bail if the current state matches the desired state if ([self tabBarIsVisible] == visible) return (completion)? completion(YES) : nil; // get a frame calculation ready CGRect frame = self.tabBarController.tabBar.frame; CGFloat height = frame.size.height; CGFloat offsetY = (visible)? -height : height; // zero duration means no animation CGFloat duration = (animated)? 0.3 : 0.0; [UIView animateWithDuration:duration animations:^{ self.tabBarController.tabBar.frame = CGRectOffset(frame, 0, offsetY); } completion:completion]; } //Getter to know the current state - (BOOL)tabBarIsVisible { return self.tabBarController.tabBar.frame.origin.y < CGRectGetMaxY(self.view.frame); } //An illustration of a call to toggle current state - (IBAction)pressedButton:(id)sender { [self setTabBarVisible:![self tabBarIsVisible] animated:YES completion:^(BOOL finished) { NSLog(@"finished"); }]; } 

    Lorsque vous travaillez avec le storyboard, il est facile de configurer le View Controller pour masquer la barre d'tabs en mode Push, sur le View Controller de destination, cochez simplement cette case:
    entrez la description de l'image ici

    Selon Apple Docs, la propriété hidesBottomBarWhenPushed de UIViewController, une valeur booleanne, indique si la barre d'outils en bas de l'écran est masquée lorsque le controller de vue est transmis à un controller de navigation.

    La valeur de cette propriété sur le controller de vue supérieur détermine si la barre d'outils est visible.

    L'approche recommandée pour masquer la barre d'tabs serait comme suit

      ViewController *viewController = [[ViewController alloc] init]; viewController.hidesBottomBarWhenPushed = YES; // This property needs to be set before pushing viewController to the navigationController's stack. [self.navigationController pushViewController:viewController animated:YES]; 

    Cependant, notez que cette approche ne sera appliquée qu'à viewController et ne sera pas propagée à d'autres controllers de vue, sauf si vous commencez à définir la même propriété hidesBottomBarWhenPushed dans d'autres viewControllers avant de la pousser dans la stack du controller de navigation.

    Version rapide:

     @IBAction func tap(sender: AnyObject) { setTabBarVisible(!tabBarIsVisible(), animated: true, completion: {_ in }) } // pass a param to describe the state change, an animated flag and a completion block matching UIView animations completion func setTabBarVisible(visible: Bool, animated: Bool, completion:(Bool)->Void) { // bail if the current state matches the desired state if (tabBarIsVisible() == visible) { return completion(true) } // get a frame calculation ready let height = tabBarController!.tabBar.frame.size.height let offsetY = (visible ? -height : height) // zero duration means no animation let duration = (animated ? 0.3 : 0.0) UIView.animateWithDuration(duration, animations: { let frame = self.tabBarController!.tabBar.frame self.tabBarController!.tabBar.frame = CGRectOffset(frame, 0, offsetY); }, completion:completion) } func tabBarIsVisible() -> Bool { return tabBarController!.tabBar.frame.origin.y < CGRectGetMaxY(view.frame) } 

    Version 3.0 de Swift, en utilisant une extension:

     extension UITabBarController { private struct AssociatedKeys { // Declare a global var to produce a unique address as the assoc object handle static var orgFrameView: UInt8 = 0 static var movedFrameView: UInt8 = 1 } var orgFrameView:CGRect? { get { return objc_getAssociatedObject(self, &AssociatedKeys.orgFrameView) as? CGRect } set { objc_setAssociatedObject(self, &AssociatedKeys.orgFrameView, newValue, .OBJC_ASSOCIATION_COPY) } } var movedFrameView:CGRect? { get { return objc_getAssociatedObject(self, &AssociatedKeys.movedFrameView) as? CGRect } set { objc_setAssociatedObject(self, &AssociatedKeys.movedFrameView, newValue, .OBJC_ASSOCIATION_COPY) } } override open func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() if let movedFrameView = movedFrameView { view.frame = movedFrameView } } func setTabBarVisible(visible:Bool, animated:Bool) { //since iOS11 we have to set the background colour to the bar color it seams the navbar seams to get smaller during animation; this visually hides the top empty space... view.backgroundColor = self.tabBar.barTintColor // bail if the current state matches the desired state if (tabBarIsVisible() == visible) { return } //we should show it if visible { tabBar.isHidden = false UIView.animate(withDuration: animated ? 0.3 : 0.0) { //restore form or frames self.view.frame = self.orgFrameView! //errase the stored locations so that... self.orgFrameView = nil self.movedFrameView = nil //...the layoutIfNeeded() does not move them again! self.view.layoutIfNeeded() } } //we should hide it else { //safe org positions orgFrameView = view.frame // get a frame calculation ready let offsetY = self.tabBar.frame.size.height movedFrameView = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height + offsetY) //animate UIView.animate(withDuration: animated ? 0.3 : 0.0, animations: { self.view.frame = self.movedFrameView! self.view.layoutIfNeeded() }) { (_) in self.tabBar.isHidden = true } } } func tabBarIsVisible() ->Bool { return orgFrameView == nil } } 
    • Ceci est basé sur la consortingbution de Sherwin Zadeh après quelques heures de jeu.
    • Au lieu de déplacer la barre de tabulation elle-même, elle déplace le cadre de la vue, ce qui fait bien glisser la barre d'tabs hors du bas de l'écran mais …
    • … a l'avantage que le contenu affiché à l'intérieur de l'UITabbarcontroller est alors aussi en plein écran!
    • Notez qu'il est également possible d'utiliser la fonctionnalité AssociatedObject pour joindre des données à UIView sans sous-class et donc une extension est possible (les extensions n'autorisent pas les propriétés stockées)

    entrez la description de l'image ici

    Essayez de définir le cadre du tabBar dans l'animation. Voir ce tutoriel.

    Sachez simplement que c'est une mauvaise pratique de le faire, vous devez définir afficher / masquer tabBar lorsque UIViewController poussera en définissant la propriété hidesBottomBarWhenPushed sur YES .

    essayé dans swift 3.0 / iOS10 / Xcode 8:

      self.tabBarController?.tabBar.isHidden = true 

    Je l'ai mis quand mon controller est montré: (et Masquer quand return, après la navigation)

     override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) self.tabBarController?.tabBar.isHidden = false } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) self.tabBarController?.tabBar.isHidden = true } 

    BTW: il vaut mieux avoir un drapeau pour save si montré ou non, car d'autres évents peuvent éventuellement triggersr cacher / montrer

    Malheureusement, je ne peux pas commenter la réponse de HixField parce que je n'ai pas assez de réputation, donc je dois laisser cela comme une réponse séparée.

    Sa réponse manque la propriété calculée pour movedFrameView , qui est:

     var movedFrameView:CGRect? { get { return objc_getAssociatedObject(self, &AssociatedKeys.movedFrameView) as? CGRect } set { objc_setAssociatedObject(self, &AssociatedKeys.movedFrameView, newValue, .OBJC_ASSOCIATION_COPY) } } 

    Réécrivez la réponse de Sherwin Zadeh dans Swift 4:

     /* tab bar hide/show animation */ extension AlbumViewController { // pass a param to describe the state change, an animated flag and a completion block matching UIView animations completion func setTabBarVisible(visible: Bool, animated: Bool, completion: ((Bool)->Void)? = nil ) { // bail if the current state matches the desired state if (tabBarIsVisible() == visible) { if let completion = completion { return completion(true) } else { return } } // get a frame calculation ready let height = tabBarController!.tabBar.frame.size.height let offsetY = (visible ? -height : height) // zero duration means no animation let duration = (animated ? kFullScreenAnimationTime : 0.0) UIView.animate(withDuration: duration, animations: { let frame = self.tabBarController!.tabBar.frame self.tabBarController!.tabBar.frame = frame.offsetBy(dx: 0, dy: offsetY) }, completion:completion) } func tabBarIsVisible() -> Bool { return tabBarController!.tabBar.frame.origin.y < view.frame.maxY } } 

    Cela me trompe: [self.tabBar setHidden:YES];
    self est le controller de vue, tabBar est l'identifiant de tabBar.