簡體   English   中英

Swift UITabBarController 隱藏動畫

[英]Swift UITabBarController hide with animation

我試圖在隱藏時向我的 tabBarController 添加動畫。 林能完成與此效果navigationBarController使用self.navigationController?.isNavigationBarHidden = true 我可以通過使用self.tabBarController?.tabBar.isHidden = true隱藏 tabBar 但我沒有得到動畫我該怎么做,提前謝謝你。

我為 UIViewController 開發了一個 util 擴展
Swift 4兼容:

extension UIViewController {

    func setTabBarHidden(_ hidden: Bool, animated: Bool = true, duration: TimeInterval = 0.3) {
        if animated {
            if let frame = self.tabBarController?.tabBar.frame {
                let factor: CGFloat = hidden ? 1 : -1
                let y = frame.origin.y + (frame.size.height * factor)
                UIView.animate(withDuration: duration, animations: {
                    self.tabBarController?.tabBar.frame = CGRect(x: frame.origin.x, y: y, width: frame.width, height: frame.height)
                })
                return
            }
        }
        self.tabBarController?.tabBar.isHidden = hidden
    }

}

您可以在動畫中更改標簽欄的框架,例如:

func hideTabBar() {
    var frame = self.tabBarController?.tabBar.frame
    frame?.origin.y = self.view.frame.size.height + (frame?.size.height)!
    UIView.animate(withDuration: 0.5, animations: {
        self.tabBarController?.tabBar.frame = frame!
    })
}

func showTabBar() {
    var frame = self.tabBarController?.tabBar.frame
    frame?.origin.y = self.view.frame.size.height - (frame?.size.height)!
    UIView.animate(withDuration: 0.5, animations: {
        self.tabBarController?.tabBar.frame = frame!
    })
}

它將標簽欄設置在可見屏幕的正下方,以便它從底部向上/向下滑動。

改進@Luca Davanzo 的響應。 如果欄已經隱藏,它將繼續隱藏它並將其向下移動。 也去掉了返回,所以tabbar.hidden 的狀態在動畫發生時會發生變化。 所以我添加了一個檢查:

extension UIViewController {

func setTabBarHidden(_ hidden: Bool, animated: Bool = true, duration: TimeInterval = 0.5) {
    if self.tabBarController?.tabBar.isHidden != hidden{
        if animated {
            //Show the tabbar before the animation in case it has to appear
            if (self.tabBarController?.tabBar.isHidden)!{
                self.tabBarController?.tabBar.isHidden = hidden
            }
            if let frame = self.tabBarController?.tabBar.frame {
                let factor: CGFloat = hidden ? 1 : -1
                let y = frame.origin.y + (frame.size.height * factor)
                UIView.animate(withDuration: duration, animations: {
                    self.tabBarController?.tabBar.frame = CGRect(x: frame.origin.x, y: y, width: frame.width, height: frame.height)
                }) { (bool) in
                    //hide the tabbar after the animation in case ti has to be hidden
                    if (!(self.tabBarController?.tabBar.isHidden)!){
                        self.tabBarController?.tabBar.isHidden = hidden
                    }
                }
            }
        }
    }
}

}

如果您需要將其從隱藏切換為可見,反之亦然:

func toggleTabbar() {
    guard var frame = tabBarController?.tabBar.frame else { return }
    let hidden = frame.origin.y == view.frame.size.height
    frame.origin.y = hidden ? view.frame.size.height - frame.size.height : view.frame.size.height
    UIView.animate(withDuration: 0.3) {
        self.tabBarController?.tabBar.frame = frame
    }
}

斯威夫特 4 解決方案:

tabBarController?.tabBar.isHidden = true
UIView.transition(with: tabBarController!.view, duration: 0.35, options: .transitionCrossDissolve, animations: nil)

這是一個簡單的擴展:

func setTabBar(hidden:Bool) {
    guard let frame = self.tabBarController?.tabBar.frame else {return }
    if hidden {
        UIView.animate(withDuration: 0.3, animations: {
            self.tabBarController?.tabBar.frame = CGRect(x: frame.origin.x, y: frame.origin.y + frame.height, width: frame.width, height: frame.height)
        })
    }else {

        UIView.animate(withDuration: 0.3, animations: {
            self.tabBarController?.tabBar.frame = UITabBarController().tabBar.frame

        })
    }
}

你必須添加 UIView transitionWithView 類 func

斯威夫特 2

func hideTabBarWithAnimation() -> () {
    UIView.transitionWithView(tableView, duration: 1.0, options: .TransitionCrossDissolve, animations: { () -> Void in
        self.tabBarController?.tabBar.hidden = true
    }, completion: nil)
}

斯威夫特 3、4、5

func hideTabBarWithAnimation() -> () {
    UIView.transition(with: tableView, duration: 1.0, options: .transitionCrossDissolve, animations: { () -> Void in
        self.tabBarController?.tabBar.isHidden = true
    }, completion: nil)
}

所以我現在已經玩了 3 天,發現在我的代碼中對我有用的是 Adriana 2018 年 9 月 14 日的帖子。但是我不確定一旦復制到我的項目中如何使用編碼。 因此,經過大量實驗后,我發現我可以使用此 func 的方式是將以下內容放入相應的滑動操作中。

setTabBarHidden(false)


setTabBarHidden(true)

我的下一步是嘗試在同一時間在同一 UIView 中使用 UIScrollView 的同時使滑動操作起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM