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

Phi*_* B. 9 uitabbarcontroller show-hide uiscrollview ios swift

我对iOS开发很新.现在我正在尝试隐藏我的标签栏,当我向下滚动时,向上滚动标签栏应该出现.我想像导航栏一样以动画制作动画.对于导航栏,我只需单击"属性"检查器中的选项.我看到了工具栏的一些示例,但我不能将其作为标签栏.

self.tabBarController?.tabBar.hidden = true 只是隐藏我的tabbar,但它不像导航控制器那样动画.

Ari*_*dor 34

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

它在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)
    }
}
Run Code Online (Sandbox Code Playgroud)

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

func scrollViewDidScroll(scrollView: UIScrollView) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

但如果您选择这样,那么您必须处理多个实际隐藏tabBar的辅助方法的调用.

然后你需要添加这个方法来动画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}
        })
    }
}
Run Code Online (Sandbox Code Playgroud)

更新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
    })
}
Run Code Online (Sandbox Code Playgroud)

  • 它隐藏了`tabBar`并在`tabBar`下面显示了视图,它为您显示了一个黑色区域,因为`tableViewController`没有覆盖该区域。 (2认同)

小智 5

在Ariel的回答基础上,我更新了Swift3的代码.这对我的收藏视图很有用.

override func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
        if scrollView.panGestureRecognizer.translation(in: scrollView).y < 0 {
            changeTabBar(hidden: true, animated: true)
        }else{
            changeTabBar(hidden: false, animated: true)
        }

    }

func changeTabBar(hidden:Bool, animated: Bool){
        let tabBar = self.tabBarController?.tabBar
        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
        if frame != nil
        {
            UIView.animate(withDuration: duration,
                                       animations: {tabBar!.frame = frame!.offsetBy(dx: 0, dy: offset)},
                                       completion: {
                                        print($0)
                                        if $0 {tabBar?.isHidden = hidden}
            })
        }
    }
Run Code Online (Sandbox Code Playgroud)


LC *_*C 웃 5

此答案是对Ariel答案的略微修改,在用户滚动时会添加动画。

extension ViewController:UIScrollViewDelegate{
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        if scrollView.panGestureRecognizer.translation(in: scrollView).y < 0{
            //scrolling down
            changeTabBar(hidden: true, animated: true)
        }
        else{
            //scrolling up
            changeTabBar(hidden: false, animated: true)
        }
    }

    func changeTabBar(hidden:Bool, animated: Bool){
        let tabBar = self.tabBarController?.tabBar
        let offset = (hidden ? UIScreen.main.bounds.size.height : UIScreen.main.bounds.size.height - (tabBar?.frame.size.height)! )
        if offset == tabBar?.frame.origin.y {return}
        print("changing origin y position")
        let duration:TimeInterval = (animated ? 0.5 : 0.0)
        UIView.animate(withDuration: duration,
                       animations: {tabBar!.frame.origin.y = offset},
                       completion:nil)
    }
}
Run Code Online (Sandbox Code Playgroud)