一尘不染

iOS / Swift-向下/向上滚动时隐藏/显示UITabBarController

swift

我是iOS开发的新手。现在,当我向下滚动并且向上滚动时,我想隐藏我的标签栏。我希望以与导航栏相同的方式对此进行动画处理。对于导航栏,我只需单击“属性”检查器中的选项。我看到了工具栏的一些示例,但是我不能采用它作为标签栏。

self.tabBarController?.tabBar.hidden = true 只是隐藏了我的标签栏,但它没有像导航控制器那样具有动画效果。


阅读 354

收藏
2020-07-07

共1个答案

一尘不染

这是我在生产应用程序中实际使用的代码。

它在 Swift中 ,还更新了UITabBar.hiddenvar。

func scrollViewWillBeginDragging(scrollView: UIScrollView) {
    if scrollView.panGestureRecognizer.translation(in: scrollView).y < 0{
        changeTabBar(hidden: true, animated: true)
    }
    else{
        changeTabBar(hidden: false, animated: true)
    }
}

您还可以使用其他回调方法:

func scrollViewDidScroll(scrollView: UIScrollView) {
    ...
}

但是,如果您选择这样做,则必须处理对实际上隐藏tabBar的helper方法的多次调用。

然后,您需要添加此方法来对tabBar的隐藏/显示进行动画处理。

func changeTabBar(hidden:Bool, animated: Bool){
    var tabBar = self.tabBarController?.tabBar
    if tabBar!.hidden == hidden{ return }
    let frame = tabBar?.frame
    let offset = (hidden ? (frame?.size.height)! : -(frame?.size.height)!)
    let duration:NSTimeInterval = (animated ? 0.5 : 0.0)
    tabBar?.hidden = false
    if frame != nil
    {
        UIView.animateWithDuration(duration,
            animations: {tabBar!.frame = CGRectOffset(frame!, 0, offset)},
            completion: {
                println($0)
                if $0 {tabBar?.hidden = hidden}
        })
    }
}

更新Swift 4

func changeTabBar(hidden:Bool, animated: Bool){
    guard let tabBar = self.tabBarController?.tabBar else { return; }
    if tabBar.isHidden == hidden{ return }
    let frame = tabBar.frame
    let offset = hidden ? frame.size.height : -frame.size.height
    let duration:TimeInterval = (animated ? 0.5 : 0.0)
    tabBar.isHidden = false

    UIView.animate(withDuration: duration, animations: {
        tabBar.frame = frame.offsetBy(dx: 0, dy: offset)
    }, completion: { (true) in
        tabBar.isHidden = hidden
    })
}
2020-07-07