如何在 iOS 13 中隐藏带有动画的标签栏?

Posted

技术标签:

【中文标题】如何在 iOS 13 中隐藏带有动画的标签栏?【英文标题】:How to hide the tab bar with animation in iOS 13? 【发布时间】:2019-12-01 19:03:29 【问题描述】:

在我的 tabBarController 中,我使用这两种方法来隐藏/显示 tabBar:

func showTabBar() 
    tabBar.isHidden = false
    UIView.animate(withDuration: 0.3) 
        self.tabBar.transform = .identity
    


func hideTabBar() 
    UIView.animate(withDuration: 0.3, animations: 
        self.tabBar.transform = CGAffineTransform(translationX: 0, y: self.tabBar.frame.height)
    , completion:  _ in
        self.tabBar.isHidden = true
    )

这在 ios 12 及更低版本中运行良好,但在 iOS 13 中,当应用转换时,整个 tabBar 被破坏(见图)。我知道您可以使用帧动画隐藏 tabBar,但应用转换要容易得多,我不明白为什么会出现这种情况以及 iOS 13 中的哪些更改导致其无法正常工作

【问题讨论】:

您找到解决方案了吗?我也有同样的问题... @benjamin 还没有。显然,您不能在 iOS 13 标签栏上使用转换。你有两个选择:要么用帧动画实现它,要么使用内置的 hidesBottomBarWhenPushed 功能。 好的,谢谢。我用他们的反馈助手向 Apple 发送了一条消息。我希望他们能帮助我们...... 【参考方案1】:

tabbar 的'transform' 属性目前在 iOS 13 中不工作,也许稍后会工作。

隐藏标签栏时,您只需按住标签栏的最后一帧。

显示标签栏:-

func showTabbar(_ tabBarController: UITabBarController?, _ lastTabBarFrame: CGRect?) 
    if #available(iOS 13, *) 
        UIView.animate(withDuration: 0.3, animations: 
            tabBarController?.tabBar.frame = lastTabBarFrame ?? .zero
        , completion:  (_) in
        )
     else 
        UIView.animate(withDuration: 0.3, animations: 
            tabBarController?.tabBar.transform = .identity
        , completion:  (_) in
        )
    

隐藏标签栏:-

func hideTabbar(_ tabBarController: UITabBarController?, _ lastTabBarFrame: CGRect?, _ view: UIView) 
    if #available(iOS 13, *) 
        UIView.animate(withDuration: 0.3, animations: 
            tabBarController?.tabBar.frame = CGRect(x: 0, y: view.bounds.height + (lastTabBarFrame?.height ?? 0.0) + 20, width: lastTabBarFrame?.width ?? 0.0, height: lastTabBarFrame?.height ?? 0.0)
        )  (_) in
        
     else 
        UIView.animate(withDuration: 0.3, animations: 
            tabBarController?.tabBar.transform = CGAffineTransform(translationX: 0, y: tabBarController?.tabBar.frame.height ?? 0.0)
        )  (_) in
        
    

使用方法:-

var lastTabBarFrame: CGRect?

self.lastTabBarFrame = self.tabBarController?.tabBar.frame

hideTabbar(self.tabBarController, self.lastTabBarFrame, self.view)

showTabbar(self.tabBarController, self.lastTabBarFrame)

【讨论】:

以上是关于如何在 iOS 13 中隐藏带有动画的标签栏?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 7 中隐藏带有动画的状态栏?

像 Safari 应用程序一样拖动时如何隐藏标签栏?

如何隐藏带有另一个视图控制器的标签栏视图控制器?

在 react-native 中隐藏和显示带有动画的 createBottomTabNavigator 选项卡栏

当用户直接点击标签栏项目时,如何禁用滑动动画?

带有延迟和持续时间 Ios 的动画标签