TabView 隐藏

2023-02-16  本文已影响0人  EnjoyWT

增加新类

import SwiftUI
import Combine
struct SUIView: UIViewRepresentable {

    func updateUIView(_ uiView: UIView, context: Context) {
        
    }
    


    func makeCoordinator() -> Coordinator {
    }
    func makeUIView(context: Context) -> UIView {
        //设置mapView的代理
       let mapView = UIView()
        mapView.backgroundColor = .green
      
        
        return mapView
    }
    
}


class TabBarHandle {
    var tabBar: UITabBar?
    var tabController:UITabBarController?
    var tabBarViewFrame: CGRect?
    
    func hidenTabView(){
        self.tabBarViewFrame = tabController?.view.frame
        let height = tabBar!.frame.height

        self.tabController?.tabBar.hide()
        tabController?.view.frame = CGRect(x:0, y:0, width:tabBarViewFrame!.width, height:tabBarViewFrame!.height + height);

    }
    func showTabView(){
        self.tabController?.tabBar.show()
        guard let tabBarFrame = tabBarViewFrame else {
            return
        }

        self.tabController?.view.frame = tabBarFrame
    }
}
struct TabBarExtractor: UIViewControllerRepresentable {
    @Binding var tabBarHandel: TabBarHandle?

    func updateUIViewController(_ uiViewController: UIViewControllerType, context: Context) {}

    func makeUIViewController(context: Context) -> some UIViewController {
        let controller = ViewController()
       
        controller.onTabBarAppearanceHandle = { (tb, tbc) in
            tabBarHandel?.tabBar = tb
            tabBarHandel?.tabController = tbc

        }
        return controller
    }
 
}

private extension TabBarExtractor {
    class ViewController: UIViewController {
        var onTabBarAppearanceHandle: ((UITabBar, UITabBarController) -> Void)?

        override func viewWillAppear(_ animated: Bool) {
            super.viewWillAppear(animated)

            if let tabBar = self.tabBarController?.tabBar {
                onTabBarAppearanceHandle?(tabBar, self.tabBarController!)
            } else {
                print("Could not locate TabBar! Try change extractor place in views hierarchy.")
            }
        }
    }
}
import UIKit

extension UITabBar {
    func toggleVisibility() {
        if isHidden {
            show()
        } else {
            hide()
        }
    }

    func show() {
        guard isHidden else { return }

        let visibleY = frame.origin.y
        let hiddenY = visibleY + frame.height
        frame.origin.y = hiddenY
        isHidden = false

        UIView.animate(withDuration: 0.25) { [weak self] in
            self?.frame.origin.y = visibleY
        }
    }

    func hide() {
        guard !isHidden else { return }

//        let visibleY = frame.origin.y
//        let hiddenY = visibleY + frame.height
        self.isHidden = true
        
        /* 动画会造成view布局问题*/
//        UIView.animate(withDuration: 0.25) { [weak self] in
//            self?.frame.origin.y = hiddenY
//        } completion: { [weak self] completed in
//            guard completed else { return }
//            self?.isHidden = true
//
//            self?.frame.origin.y = visibleY
//        }
    }
}

调用方法

struct SecondView: View {
    @State private var tabbarhandle:TabBarHandle? = TabBarHandle()
    var body: some View {
        VStack {
            NavigationView
            {
                NavigationLink(destination: ThirdView().onAppear {
                    tabbarhandle?.hidenTabView()
                }.onDisappear(perform: {
                    tabbarhandle?.showTabView()

                })) {
                    Text("Second View, tap to navigate")
                        .font(.headline)
                }

            }.background{
                TabBarExtractor(tabBarHandel: $tabbarhandel)
            }
      
        }
        .navigationTitle("Second title")
        .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity, alignment: .center)
        .background(Color.orange)
    }
}

参考文章1
参考文章2

上一篇下一篇

猜你喜欢

热点阅读