How do I hide/show tabBar when tapped using Swift in iOS8

后端 未结 10 1057
终归单人心
终归单人心 2020-12-04 12:44

I am trying to mimic the UINavigationController\'s new hidesBarsOnTap with a tab bar. I have seen many answers to this that either point to setting the hi

10条回答
  •  猫巷女王i
    2020-12-04 13:06

    I had to adapt the accepted answer to this question a bit. It was hiding the bar but my view wasn't sizing itself appropriately so I was left with a space at the bottom.

    The following code successfully animates the hiding of the tab bar while resizing the view to avoid that issue.

    Updated for Swift 3 (now with less ugly code)

    func setTabBarVisible(visible: Bool, animated: Bool) {
        guard let frame = self.tabBarController?.tabBar.frame else { return }
        let height = frame.size.height
        let offsetY = (visible ? -height : height)
        let duration: TimeInterval = (animated ? 0.3 : 0.0)
    
        UIView.animate(withDuration: duration,
                       delay: 0.0,
                       options: UIViewAnimationOptions.curveEaseIn,
                       animations: { [weak self] () -> Void in
                        guard let weakSelf = self else { return }
                        weakSelf.tabBarController?.tabBar.frame = frame.offsetBy(dx: 0, dy: offsetY)
                        weakSelf.view.frame = CGRect(x: 0, y: 0, width: weakSelf.view.frame.width, height: weakSelf.view.frame.height + offsetY)
                        weakSelf.view.setNeedsDisplay()
                        weakSelf.view.layoutIfNeeded()
        })
    }
    
    func handleTap(recognizer: UITapGestureRecognizer) {
        setTabBarVisible(visible: !tabBarIsVisible(), animated: true)
    }
    
    func tabBarIsVisible() -> Bool {
        guard let tabBar = tabBarController?.tabBar else { return false }
        return tabBar.frame.origin.y < UIScreen.main.bounds.height
    }
    

    Older Swift 2 Version

    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)
        println ("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
            }
        }
    }
    
    @IBAction func handleTap(recognizer: UITapGestureRecognizer) {
        setTabBarVisible(!tabBarIsVisible(), animated: true)
    }
    
    func tabBarIsVisible() -> Bool {
        return self.tabBarController?.tabBar.frame.origin.y < UIScreen.mainScreen().bounds.height
    }
    

提交回复
热议问题