Ios 当推压使UITabBar“跳跃”时隐藏底部酒吧

Ios 当推压使UITabBar“跳跃”时隐藏底部酒吧,ios,iphone,swift,cocoa-touch,uitabbarcontroller,Ios,Iphone,Swift,Cocoa Touch,Uitabbarcontroller,我有一个带有选项卡栏和导航栏的应用程序 我有一个BaseVC和一个DetailVC。我正在从BaseVC推DetailVC。我希望选项卡栏位于VC DetailVC下。我使用HidesBottomBar来实现它。它工作得很好,但是由于某种原因,当它为推送设置动画时,选项卡栏仍然可见,并且当动画结束时,选项卡栏被隐藏。我希望它是下推VC在动画太多 我的代码是: self.hidesBottomBarWhenPushed = true self.navigationController?.push

我有一个带有选项卡栏和导航栏的应用程序

我有一个BaseVC和一个DetailVC。我正在从BaseVC推DetailVC。我希望选项卡栏位于VC DetailVC下。我使用HidesBottomBar来实现它。它工作得很好,但是由于某种原因,当它为推送设置动画时,选项卡栏仍然可见,并且当动画结束时,选项卡栏被隐藏。我希望它是下推VC在动画太多

我的代码是:

self.hidesBottomBarWhenPushed  = true
self.navigationController?.pushViewController(detailVC, animated: true)
self.hidesBottomBarWhenPushed = false
错误的结果是:


有人知道tabbar为什么会跳吗?谢谢大家!

看过这个有问题的项目后,我找到了一个让它工作的方法:

从TabBarViewController中删除viewWillLayoutSubviews,使其不再确定选项卡栏的高度,从而不会停止动画正常工作。 创建一个名为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)
    }
}
创建一个名为TabBarStoryboard的故事板。它将不会用于任何其他用途,然后用于保存您稍后创建的UITABBARC控制器

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

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

在RootViewController中,替换以下内容:

fileprivate let tabBarViewController = TabBarViewController()
为此:

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

    if let tabBar = self.tabBar as? MyTabBar {
        tabBar.tabBarHeight = self.tabBarHeight
    }
现在,如果所有这些都正确,您应该有一个您想要的大小的选项卡栏,并且动画应该正常工作,因为选项卡栏的高度不再由viewDidLayoutSubviews方法控制

我不得不使用故事板来保存基本的UITabBarController,因为我找不到一种方法来设置它的UITabBar属性的类,否则如果有人知道添加注释的方法

如果这是很难遵循我已经上传了我的项目版本到dropbox,这是链接:。小心,因为它将解压缩到相同的目录结构,所以将其解压缩到与原始文件夹不同的文件夹,否则将丢失原始文件夹


这种方法对我来说似乎是正确的,我认为没有任何理由会有任何问题,但首先要彻底测试它。

查看了相关项目后,我找到了一种方法使其工作:

从TabBarViewController中删除viewWillLayoutSubviews,使其不再确定选项卡栏的高度,从而不会停止动画正常工作。 创建一个名为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)
    }
}
创建一个名为TabBarStoryboard的故事板。它将不会用于任何其他用途,然后用于保存您稍后创建的UITABBARC控制器

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

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

在RootViewController中,替换以下内容:

fileprivate let tabBarViewController = TabBarViewController()
为此:

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

    if let tabBar = self.tabBar as? MyTabBar {
        tabBar.tabBarHeight = self.tabBarHeight
    }
现在,如果所有这些都正确,您应该有一个您想要的大小的选项卡栏,并且动画应该正常工作,因为选项卡栏的高度不再由viewDidLayoutSubviews方法控制

我不得不使用故事板来保存基本的UITabBarController,因为我找不到一种方法来设置它的UITabBar属性的类,否则如果有人知道添加注释的方法

如果这是很难遵循我已经上传了我的项目版本到dropbox,这是链接:。小心,因为它将解压缩到相同的目录结构,所以将其解压缩到与原始文件夹不同的文件夹,否则将丢失原始文件夹


这种方法对我来说似乎是正确的,我看不出有任何问题的原因,但首先要彻底测试它。

顺便说一句,我有一个以上示例的简单变体 我在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并按下所需的视图控制器。

顺便说一句,我有一个以上示例cheers的简单变体 我在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并按下所需的视图控制器。

您需要显示有关所有设置的更多信息。例如,UtiAbbarController中的选项卡栏是根视图还是其他视图?@supporteroftruth Yes。我有一个名为RootViewController的VC,它提供了一个带有UINav选项卡的UITabBarController
igationController,其rootVC是我的内容vc BaseVC/DetailVC。你了解这个复杂的小结构吗RootViewController如何“呈现”UITabBarController?@supporteroftruth self.presentself.tabBarViewController,动画:true,完成:nil我不确定。就个人而言,我不会改变标签栏的高度,因为你会遇到这样的问题,你会失去一些屏幕空间。我尝试了一个基本的自定义动画,但没有成功。我会考虑一下,但正如我说的,我现在不确定。你需要展示更多关于它的设置信息。例如,UtiAbbarController中的选项卡栏是根视图还是其他视图?@supporteroftruth Yes。我有一个名为RootViewController的VC,它提供了一个UITabBarController,它有一个带有UINavigationController的选项卡,它的rootVC是我的内容VC BaseVC/DetailVC。你了解这个复杂的小结构吗RootViewController如何“呈现”UITabBarController?@supporteroftruth self.presentself.tabBarViewController,动画:true,完成:nil我不确定。就个人而言,我不会改变标签栏的高度,因为你会遇到这样的问题,你会失去一些屏幕空间。我尝试了一个基本的自定义动画,但没有成功。我会考虑一下,但正如我说的,我现在不确定。你能从Dropbox中删除这个文件吗。我不希望它可以公开下载:。再次感谢!完成。我已从dropbox中删除该文件并删除了本地副本。应用程序看起来不错。非常好的方法。。。我只是希望我不需要故事板来执行它!你能从Dropbox中删除这个文件吗。我不希望它可以公开下载:。再次感谢!完成。我已从dropbox中删除该文件并删除了本地副本。应用程序看起来不错。非常好的方法。。。我只是希望我不需要故事板来执行它!