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

后端 未结 10 1004
终归单人心
终归单人心 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条回答
  •  小蘑菇
    小蘑菇 (楼主)
    2020-12-04 13:00

    Loved Michael Campsall's answer. Here's the same code as extension, if somebody is interested:

    Swift 2.3

    extension UITabBarController {
    
        func setTabBarVisible(visible:Bool, animated:Bool) {
    
            // bail if the current state matches the desired state
            if (tabBarIsVisible() == visible) { return }
    
            // get a frame calculation ready
            let frame = self.tabBar.frame
            let height = frame.size.height
            let offsetY = (visible ? -height : height)
    
            // animate the tabBar
            UIView.animateWithDuration(animated ? 0.3 : 0.0) {
                self.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()
            }
        }
    
        func tabBarIsVisible() ->Bool {
            return self.tabBar.frame.origin.y < CGRectGetMaxY(self.view.frame)
        }
    }
    

    Swift 3

    extension UIViewController {
    
        func setTabBarVisible(visible: Bool, animated: Bool) {
            //* This cannot be called before viewDidLayoutSubviews(), because the frame is not set before this time
    
            // bail if the current state matches the desired state
            if (isTabBarVisible == visible) { return }
    
            // get a frame calculation ready
            let frame = self.tabBarController?.tabBar.frame
            let height = frame?.size.height
            let offsetY = (visible ? -height! : height)
    
            // zero duration means no animation
            let duration: TimeInterval = (animated ? 0.3 : 0.0)
    
            //  animate the tabBar
            if frame != nil {
                UIView.animate(withDuration: duration) {
                    self.tabBarController?.tabBar.frame = frame!.offsetBy(dx: 0, dy: offsetY!)
                    return
                }
            }
        }
    
        var isTabBarVisible: Bool {
            return (self.tabBarController?.tabBar.frame.origin.y ?? 0) < self.view.frame.maxY
        }
    }
    

提交回复
热议问题