Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Toolbar incorrectly positioned during push animation with hidesBottomBarWhenPushed

I have an App using a Tabbar for basic Navigation. From one of the screens of the Tabbar I want to enter another one that shows a toolbar instead of the Tabbar and a back navigation item on the top.

What is the best way to do this? If I use "Hide Bottom Bar on Push" (aka hidesBottomBarWhenPushed) and add a Toolbar to the screen I can see an animation removing the Tabbar before the Toolbar is placed at the bottom of the screen.

like image 747
Thomas Einwaller Avatar asked Mar 29 '15 20:03

Thomas Einwaller


2 Answers

Solution for UITableViewController with toolbar (requires code)

Using code from this answer, I was able to achieve the same effect, but with the toolbar at the bottom of a table view.

Add this to your table view controller:

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

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    [self.navigationController setToolbarHidden:YES animated:YES];
}

Important note: placing these calls in viewWillAppear and viewWillDisappear instead of viewDidLoad makes this easier to handle, as it will work reliably even for multiple pushes and pops of the same view controller, and you won't have to clean up after it in the previous view controller.

And configure it like this in the storyboard:

Also, enable Hides bottom bar when pushed in the storyboard, or in your code, for the view controller being pushed.

Then you can add toolbar buttons to the toolbar in the storyboard.

Build and run, and you get this effect:

enter image description here

Here's a complete sample project demonstrating this.

like image 173
Greg Avatar answered Sep 30 '22 17:09

Greg


Problem Example

enter image description here

Here is my solution,

In the first view controller that has the tabbar do this

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "someSegue" {
        if let secondVC = segue.destinationViewController as? InfoTableViewController {
            secondVC.hidesBottomBarWhenPushed = true
        }
    }
}

I also needed this, as my toolbar would re appear in the first VC.

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    navigationController?.toolbarHidden = true
}

To stop the fade up animation of the toolbar, so its just there i used this in the second VC

override func viewDidLoad() {
    super.viewDidLoad()
    navigationController?.toolbarHidden = false
}
like image 29
DogCoffee Avatar answered Sep 30 '22 17:09

DogCoffee