Swift UITabBarController隐藏动画

ppr*_*lon 3 uitabbarcontroller ios swift

我正在尝试在隐藏时向tabBarController添加动画.我可以navigationBarController通过使用来实现这种效果self.navigationController?.isNavigationBarHidden = true.我可以通过使用隐藏tabBar,self.tabBarController?.tabBar.isHidden = true但我没有得到动画我怎么能这样做,谢谢你提前.

Luc*_*nzo 10

我为UIViewController
Swift 4兼容开发了一个util扩展:

extension UIViewController {

    func setTabBarHidden(_ hidden: Bool, animated: Bool = true, duration: TimeInterval = 0.3) {
        if animated {
            if let frame = self.tabBarController?.tabBar.frame {
                let factor: CGFloat = hidden ? 1 : -1
                let y = frame.origin.y + (frame.size.height * factor)
                UIView.animate(withDuration: duration, animations: {
                    self.tabBarController?.tabBar.frame = CGRect(x: frame.origin.x, y: y, width: frame.width, height: frame.height)
                })
                return
            }
        }
        self.tabBarController?.tabBar.isHidden = hidden
    }

}
Run Code Online (Sandbox Code Playgroud)

  • 在iPhone X上,当标签栏隐藏时,标签栏的背景为灰色。 (2认同)

Sam*_*tha 9

您可以在动画中更改标签栏的框架,如下所示:

func hideTabBar() {
    var frame = self.tabBarController?.tabBar.frame
    frame?.origin.y = self.view.frame.size.height + (frame?.size.height)!
    UIView.animate(withDuration: 0.5, animations: {
        self.tabBarController?.tabBar.frame = frame!
    })
}

func showTabBar() {
    var frame = self.tabBarController?.tabBar.frame
    frame?.origin.y = self.view.frame.size.height - (frame?.size.height)!
    UIView.animate(withDuration: 0.5, animations: {
        self.tabBarController?.tabBar.frame = frame!
    })
}
Run Code Online (Sandbox Code Playgroud)

将标签栏设置在可见屏幕下方,以便从底部向上/向下滑动.


Adr*_*ana 6

改进@Luca Davanzo 的响应。如果栏已经隐藏,它将继续隐藏它并将其向下移动。也去掉了返回,所以tabbar.hidden 的状态在动画发生时会发生变化。所以我添加了一个检查:

extension UIViewController {

func setTabBarHidden(_ hidden: Bool, animated: Bool = true, duration: TimeInterval = 0.5) {
    if self.tabBarController?.tabBar.isHidden != hidden{
        if animated {
            //Show the tabbar before the animation in case it has to appear
            if (self.tabBarController?.tabBar.isHidden)!{
                self.tabBarController?.tabBar.isHidden = hidden
            }
            if let frame = self.tabBarController?.tabBar.frame {
                let factor: CGFloat = hidden ? 1 : -1
                let y = frame.origin.y + (frame.size.height * factor)
                UIView.animate(withDuration: duration, animations: {
                    self.tabBarController?.tabBar.frame = CGRect(x: frame.origin.x, y: y, width: frame.width, height: frame.height)
                }) { (bool) in
                    //hide the tabbar after the animation in case ti has to be hidden
                    if (!(self.tabBarController?.tabBar.isHidden)!){
                        self.tabBarController?.tabBar.isHidden = hidden
                    }
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

}