Hiding the tabbar and removing the space

前端 未结 14 1687
生来不讨喜
生来不讨喜 2020-11-30 00:10

Is there a way to hide tabbar and remove that space left (around 50px) ?

I tried

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


        
相关标签:
14条回答
  • 2020-11-30 00:57

    For those that like to do everything programmatically, add this line to the init method of a ViewController that shouldn't have the tabBar:

    hidesBottomBarWhenPushed = true
    
    0 讨论(0)
  • 2020-11-30 01:01

    The third answer on this question works for me in the following way:

    The code on my view controller

    @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
    }
    

    In storyboard:

    The view controller main view background color is black color:

    Then you could have another view inside (background color white), constrained trailing and leading space to superview and top and bottom space to the layout guide.

    And the result is:

    0 讨论(0)
  • 2020-11-30 01:01

    My preferred way to do that is using a wrapping controller. If I want to hide the tab bar, I just increase the height of the tab bar controller, thus effectively the tab bar is moved out of the screen.

    With this solution you don't need to hack tab bar frame and you don't depend on navigation controller push animation:

    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
            }
        }
    }
    

    0 讨论(0)
  • 2020-11-30 01:01

    This code works on iOS 10, 11, and iPhone X (including simulators) to show/hide the tabBar. I created it several years (iOS 7 time frame?) and it has worked reliably since that time.

    It works great on iPhone X as long as content content in your childViewControllers (in tabs) is pinned to topLayoutGuide, bottomLayoutGuide or SafeArea and not the main views walls. Then it all just works. Enjoy!

    @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
    

    Usage - I call it in the viewController on rotation events like so:

    -(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 讨论(0)
  • 2020-11-30 01:03

    After saw your screenshot in comment. I think you can try to set hidesBottomBarWhenPushed to true.

    hidesBottomBarWhenPushed = true
    

    Or storyboard.

    It will hide bottom bar automatically when you pushed to another view controller, and appear it again when you go back.

    0 讨论(0)
  • 2020-11-30 01:04

    You can refer this link - iOS/Swift - Hide/Show UITabBarController when scrolling down/up. For better Result Do not forget to add this line of code in your viewdidLoad() for Black screen removal after hiding Tab bar.

    if #available(iOS 11.0, *) {
            self.myScroll.contentInsetAdjustmentBehavior = .never
        }
    
    0 讨论(0)
提交回复
热议问题