hidesBottomBarWhenPushed让UITabBar"跳跃"

时间:2018-01-10 17:14:48

标签: ios iphone swift cocoa-touch uitabbarcontroller

我有一个带有标签栏和导航栏的应用。

我有BaseVCDetailVC。我从DetailVC推了BaseVC。我希望tabbar位于推送的VC DetailVC下。我使用hidesBottomBarWhenPushed来实现它。它工作得很好,但由于某种原因,当它动画推动时,标签栏仍然可见,并且当动画结束时,标签栏被隐藏。我希望它也可以在动画中推送的VC下。

我的代码是:

self.hidesBottomBarWhenPushed  = true
self.navigationController?.pushViewController(detailVC, animated: true)
self.hidesBottomBarWhenPushed = false

结果(错误)是这样的:

Gif

任何人都知道为什么tabbar"跳跃"?谢谢!

2 个答案:

答案 0 :(得分:3)

看过有问题的项目后,我找到了一种方法让它发挥作用:

  1. viewWillLayoutSubviews中移除TabBarViewController,以便它不再确定标签栏的高度,从而不会停止动画正常工作。
  2. 创建一个名为MyTabBar的新swift文件(或任何你想要的)并将其放入其中:

    import UIKit
    
    class MyTabBar: UITabBar {
    
        var tabBarHeight: CGFloat = 100
    
        override func sizeThatFits(_ size: CGSize) -> CGSize {
            let superSize = super.sizeThatFits(size)
    
            return CGSize(width: superSize.width, height: self.tabBarHeight)
        }
    }
    
  3. 创建一个名为TabBarStoryboard(或其他)的故事板。除了以后创建的UITabBarController之外,它不会被用于其他任何东西。

  4. 在故事板中,将UITabBarController的类类型设置为TabBarViewController类,以便在实例化时获取正确的类。

  5. 在故事板中,将属于UITabBarController的UITabBar的类类型设置为MyTabBar,以便在实例化时它也是正确的类。

  6. 在RootViewController中替换为:

    fileprivate let tabBarViewController = TabBarViewController()
    

    用这个:

    fileprivate lazy var tabBarViewController: TabBarViewController = {
        let storyboard = UIStoryboard(name: "TabBarStoryboard", bundle: nil)
        return storyboard.instantiateViewController(withIdentifier: "MyTabBarController") as! TabBarViewController
    }()
    
  7. 在TabBarViewController中,将其添加到viewDidLoad的末尾以设置标签栏的高度:

        if let tabBar = self.tabBar as? MyTabBar {
            tabBar.tabBarHeight = self.tabBarHeight
        }
    
  8. 现在,如果你得到了所有正确的答案,你应该有一个所需大小的标签栏,动画应该正常工作,因为标签栏的高度不再受viewDidLayoutSubviews方法控制。

    我不得不使用故事板来保存基本的UITabBarController,因为我无法找到设置其UITabBar属性的方法(如果有人知道添加注释的方式。

    如果难以理解,我已将我的项目版本上传到dropbox,这是链接:PlayWiz-NewVersion.zip。请小心,因为它将解压缩到相同的目录结构,因此将其解压缩到与原始文件夹不同的文件夹,否则您将丢失原始文件。

    该方法对我来说似乎正常工作,我认为没有理由存在任何问题,但首先要彻底测试。

答案 1 :(得分:1)

我对上述示例进行了更简单的修改(顺便说一句) 我将所有内容粘贴到viewDidLoad中,但是您可以将其编写得更漂亮。

class TabBarController: UITabBarController {

    override func viewDidLoad() {
        // create the normal buttons (controllers)
        let viewControllers = [UINavigationController(rootViewController: firstButton), UINavigationController(rootViewController: secontButton)]
        self.viewControllers = viewControllers

        // create the middle rounded button
        self.tabBar.addSubview(addItemButton)

        // setup constraints
        addItemButton.widthAnchor.constraint(equalToConstant: 64).isActive = true
        addItemButton.heightAnchor.constraint(equalToConstant: 64).isActive = true
        tabBar.centerXAnchor.constraint(equalTo: self.addItemButton.centerXAnchor).isActive = true
        tabBar.topAnchor.constraint(equalTo: self.addItemButton.centerYAnchor, constant: -8).isActive = true
    }
extension UITabBar {
    // fix clicking the (+) external to the tabbar bounds
    override open func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
        if (!self.clipsToBounds && !self.isHidden && self.alpha > 0.0) {
            let subviews = self.subviews.reversed()
            for member in subviews {
                let subPoint = member.convert(point, from: self)
                if let result:UIView = member.hitTest(subPoint, with:event) {
                    return result;
                }
            }
        }
        return super.hitTest(point, with: event)
    }

    // this fixes the "jumping" tabBar when using the "hidesBottomBarWhenPushed = true"
    override open func sizeThatFits(_ size: CGSize) -> CGSize {
        let superSize = super.sizeThatFits(size)

        return CGSize(width: superSize.width, height: 85)
    }
}

现在,只需调用hidesBottomBarWhenPushed = true并推送所需的视图控制器即可。