'hide / show tab bar when push / back. swift
Answer: Use self.tabBarController?.tabBar.hidden instead of hidesBottomBarWhenPushed in each view controller to manage whether the view controller should show a tab bar or not.
override func viewWillAppear(animated: Bool) {
self.tabBarController?.tabBar.hidden = true/false
}
I want
view controller 1: tab bar should be showed
view controller 2: tab bar should be showed
view controller 3: tab bar should not be showed.
view controller 4: tab bar should not be showed.
I wrote
// prepareForSegue in view controller 1,
let upcoming = segue.destinationViewController as! viewcontroller3
upcoming.hidesBottomBarWhenPushed = true
// in view controller 3,
func clickOnButton(button: UIButton) {
self.hidesBottomBarWhenPushed = false
self.performSegueWithIdentifier("viewController2", sender: self)
self.hidesBottomBarWhenPushed = true
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "viewController2" {
let upcoming = segue.destinationViewController as! viewController2
upcoming.hidesBottomBarWhenPushed = false
}
}
// prepareForSegue in view controller 2
let upcoming = segue.destinationViewController as! viewController4
upcoming.hidesBottomBarWhenPushed = true
if 1 -> 3 then back to 1, works.
if 1 -> 3 -> 2 then back to 3 and back to 1, works.
if 2 -> 4, then back to 2, works.
if 1 -> 3 -> 2 -> 4 then back to 2, tab bar is not showed. Wondering why. Any suggestions or some explanation of hidesBottomBarWhenPushed as it confuses me a lot
Solution 1:[1]
Add hidesBottomBarWhenPushed property to destination view controller, and set to true.
Example with push VC with identifier:
let storyboard = UIStoryboard(name: STORYBOARD_NAME, bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: VC_IDENTIFIER) as! YourViewController
vc.hidesBottomBarWhenPushed = true
navigationController?.pushViewController(vc, animated: true)
Solution 2:[2]
Here's my two cents. Swift 3/4/5:
Approach 1: (Recommended)
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "YourSegueIdentifier" {
let destinationController = segue.destinationViewController as! YourViewController
destinationController.hidesBottomBarWhenPushed = true // Does all the hide/show work.
}
}
Approach 2:
override func viewWillAppear(_ animated: Bool) { // As soon as vc appears
super.viewWillAppear(true)
self.tabBarController?.tabBar.isHidden = false
}
override func viewWillDisappear(_ animated: Bool) { // As soon as vc disappears
super.viewWillDisappear(true)
self.tabBarController?.tabBar.isHidden = true
}
Solution 3:[3]
Add this implementation in ViewController you want to hide/show tabbar on pushed/popped. it will also work for all next pushed view controllers.
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if wilmove {
hidesBottomBarWhenPushed = true
}
wilmove = false
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
if wilmove {
hidesBottomBarWhenPushed = false
}
wilmove = false
}
var wilmove = false
override func willMove(toParentViewController parent: UIViewController?) {
super.willMove(toParentViewController: parent)
wilmove = true
if !isViewLoaded {
hidesBottomBarWhenPushed = true
}
}
Solution 4:[4]
Swift 5
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
self.hidesBottomBarWhenPushed = true
}
Solution 5:[5]
Swift 5:
And yet another approach... that fades the tabBar in and out.. Not saying this is strategically more advantageous than any of the other ones, such as those entailing prepareForSegue, but can be adapted to it. In any case, animating tab bar alpha avoids the harsh disappear/appear effect when setting .isHidden on the tabBar (UIView) by fading it in and out. This is done in any VC that needs it hidden when the VC is pushed or loaded and unhidden when the VC is popped or unloaded.
This will not bother to reinstate the tab bar until the back button is pushed in the navBar or equivalent action, such that when a child VC is pushed onto it, the tab bar will remain hidden, which is usually (but not always) what makes sense.
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
UIView.animate(withDuration: 0.4, delay: 0.0, options: UIView.AnimationOptions.curveEaseOut, animations: {
self.tabBarController?.tabBar.alpha = 0.0
}, completion: { (finished: Bool) -> Void in
self.tabBarController?.tabBar.isUserInteractionEnabled = false
})
}
override func viewWillDisappear(_ animated: Bool) {
if self.isMovingFromParent {
UIView.animate(withDuration: 0.4, delay: 0.0, options: UIView.AnimationOptions.curveEaseOut, animations: {
self.tabBarController?.tabBar.alpha = 1.0
}, completion: { (finished: Bool) -> Void in
self.tabBarController?.tabBar.isUserInteractionEnabled = true
})
}
}
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | nja |
| Solution 2 | |
| Solution 3 | |
| Solution 4 | ArNo |
| Solution 5 |

