hide / show UITabBarController的.tabBar(用于root视图控制器)[复制]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hide / show UITabBarController的.tabBar(用于root视图控制器)[复制]相关的知识,希望对你有一定的参考价值。

这个问题在这里已有答案:

我正在使用一个非常简单的设置与编程实例化UITabBarController

我的应用程序的配置来自服务器,并根据该配置动态设置viewControllers属性。这意味着viewControllers(以及选项卡)的数量可以随时更改。

这一切都很完美,除了一件事。

tabBar在viewControllers数组中只有1个viewController时,我想隐藏UITabBarController

我知道你可以在viewController上为新推出的viewControllers设置一个标志来隐藏底栏,但这不是我想要的。

我想以编程方式控制tabBar的可见性,显然还要设置所有正确的安全边距,以便子viewController获得所有可能的空间。

答案

我遇到过这样的场景,我使用下面的代码成功地为我工作:

extension UITabBarController {
    func setTabBarVisible(visible:Bool, duration: TimeInterval = 0.20, animated:Bool) {
        if (tabBarIsVisible() == visible) { return }
        let frame = self.tabBar.frame
        let height = frame.size.height
        let offsetY = (visible ? -height : height)
        let duration = animated ? duration : 0
        var safeAreaInset:CGFloat = 0
        if #available(ios 11, *) {
            safeAreaInset = UIApplication.shared.keyWindow?.safeAreaInsets.bottom ?? 0
            safeAreaInset += visible ? (UIApplication.shared.keyWindow?.safeAreaInsets.top ?? 0) : 0
        }

        if !visible, let window = self.view.window {
            if let view = window.viewWithTag(999) {
                view.removeFromSuperview()
            }
            let view = UIView()
            view.translatesAutoresizingMaskIntoConstraints = false
            window.insertSubview(view, at: 0)
            view.tag = 999
            view.leadingAnchor.constraint(equalTo: window.leadingAnchor).isActive = true
            view.trailingAnchor.constraint(equalTo: window.trailingAnchor).isActive = true
            view.bottomAnchor.constraint(equalTo: window.bottomAnchor).isActive = true
            view.heightAnchor.constraint(equalToConstant: safeAreaInset).isActive = true
            view.backgroundColor = .white
            window.sendSubview(toBack: view)
        }
        let viewFrame = CGRect(x:self.view.frame.origin.x,y:self.view.frame.origin.y,width: self.view.frame.width, height: (self.view.frame.height + offsetY - safeAreaInset))

        // animation
        UIView.animate(withDuration: duration, animations: {
            self.tabBar.frame.offsetBy(dx:0, dy:offsetY)
            self.view.frame = viewFrame
            self.view.setNeedsLayout()
            self.view.layoutIfNeeded()
        }) { (finished) in
            if finished {
                if let view = self.view.window?.viewWithTag(999) {
                    self.view.window?.sendSubview(toBack: view)
                }
            }
        }

    }

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

你可以像这样使用它:

有一个局部变量,它将存储可见性状态,并在设置时更新tabbar:

var tabbarHidden = false {
    didSet {
        self.tabbarController.setTabBarVisible(visible: !tabbarHidden, animated: false)
        self.tabbarController.tabBar.isHidden = tabbarHidden
    }
}

有一个功能来设置tabbar的可见性:

func setTabbarVisibility() {
    if !((self.tabbarController.selectedViewController as? UINavigationController)?.topViewController?.hidesBottomBarWhenPushed ?? false) {
        let count = Globals.sharedInstance.currentEvent?.bottom.count ?? 0
        self.tabbarHidden = count == 0
    }
}

viewWillAppearviewDidLayoutSubviews中调用此函数以更新它,因为设置来自服务器。

另一答案

在自定义TabBarViewController中写下面的代码。

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    hideTabBar() //Calling function to hide tabbar
}

//Call below function when you want hide tabbar
func hideTabBar() {
    guard let firstViewController = self.viewControllers?.first as? TableListViewController else {
        return
    }

    DispatchQueue.main.async {
        self.tabBar.isHidden = true
        firstViewController.view.frame.size.height = UIScreen.main.bounds.size.height
    }
}

//Call below function when you want unhide tabbar
func unHideTabBar() {
     guard let firstViewController = self.viewControllers?.first as? TableListViewController else {
        return
    }

    DispatchQueue.main.async {
        self.tabBar.isHidden = false
        firstViewController.view.frame.size.height = UIScreen.main.bounds.size.height - self.tabBar.frame.size.height
    }
}

希望这对你有所帮助!

以上是关于hide / show UITabBarController的.tabBar(用于root视图控制器)[复制]的主要内容,如果未能解决你的问题,请参考以下文章

jquery hide,show方法问题

Android Dialog hide()、cancel()一起使用,show()无效问题

jQuery动画隐藏和显示 hide() show() toggle()用法

.show() 和 .hide() 如何在 jquery 中工作 [重复]

ng-show

请教jquery的hide()和show()方法遇到的问题