Как скрыть пользовательский интерфейс TabBar Swift? - PullRequest
0 голосов
/ 07 мая 2020

У меня TabBarView в представлении root. В одном из родительских представлений, вложенных в представление root, я бы хотел, чтобы панель вкладок скрывалась при переходе от родительского представления к дочернему. Есть ли какая-нибудь забавная c или команда, чтобы справиться с этим?

Примерно так:

ContentView (with TabBarView) - > ExploreView (Called in TabBarView ) -> MessagesView (Child of ExploreVIew - Hide Tab bar)

Мой код можно увидеть ниже.

TabView{

    NavigationView{
        GeometryReader { geometry in
            ExploreView()
                .navigationBarTitle(Text(""), displayMode: .inline)
                .navigationBarItems(leading: Button(action: {
                }, label: {
                    HStack{
                        Image("cityOption")
                        Text("BER")
                        Image("arrowCities")
                    }.foregroundColor(Color("blackAndWhite"))
                        .font(.system(size: 12, weight: .semibold))
                }),trailing:
                    HStack{
                        Image("closttop")
                            .renderingMode(.template)
                            .padding(.trailing, 125)

                        NavigationLink(destination: MessagesView()
                            .navigationBarTitle(Text("Messages"), displayMode: .inline)
                            .navigationBarItems(trailing: Image("writemessage"))
                            .foregroundColor(Color("blackAndWhite"))
                        ){
                            Image("messages")
                        }
                    }.foregroundColor(Color("blackAndWhite"))
            )
        }
    }
    .tabItem{
        HStack{
            Image("clostNav").renderingMode(.template)
            Text("Explore")
                .font(.system(size: 16, weight: .semibold))
        }.foregroundColor(Color("blackAndWhite"))
    }
    SearchView().tabItem{
        Image("search").renderingMode(.template)
        Text("Search")
    }
    PostView().tabItem{
        HStack{
            Image("post").renderingMode(.template)
                .resizable().frame(width: 35, height: 35)
        }
    }
    OrdersView().tabItem{
        Image("orders").renderingMode(.template)
        Text("Orders")
    }
    ProfileView().tabItem{
        Image("profile").renderingMode(.template)
        Text("Profile")
    }
}

Благодарю за любую помощь! Спасибо!

Ответы [ 3 ]

1 голос
/ 08 мая 2020

Создать CustumPresentViewController.swift -

    import UIKit
    import SwiftUI

    struct ViewControllerHolder {
         weak var value: UIViewController?
    }

    struct ViewControllerKey: EnvironmentKey {
    static var defaultValue: ViewControllerHolder { return 
        ViewControllerHolder(value: 
        UIApplication.shared.windows.first?.rootViewController ) }
    }

    extension EnvironmentValues {
        var viewController: ViewControllerHolder {
            get { return self[ViewControllerKey.self] }
            set { self[ViewControllerKey.self] = newValue }
      }
    }

    extension UIViewController {
         func present<Content: View>(style: UIModalPresentationStyle = 
         .automatic, @ViewBuilder builder: () -> Content) {
             // Must instantiate HostingController with some sort of view...
             let toPresent = UIHostingController(rootView: 
              AnyView(EmptyView()))
             toPresent.modalPresentationStyle = style
             // ... but then we can reset rootView to include the environment
             toPresent.rootView = AnyView(
             builder()
            .environment(\.viewController, ViewControllerHolder(value: 
             toPresent))
    )
    self.present(toPresent, animated: true, completion: nil)
    }
}

Используйте это в необходимом представлении -

@Environment(\.viewController) private var viewControllerHolder:  
ViewControllerHolder

private var viewController: UIViewController? {
    self.viewControllerHolder.value
}

var body: some View {
    NavigationView {
        ZStack {
            Text("Navigate")
        }.onTapGesture {
             self.viewController?.present(style: .fullScreen) {
                                    EditUserView()
             }
        }
    }
}
0 голосов
/ 07 мая 2020

Если вы используете контроллер навигации, просто вызовите

self.parent?.navigationController?.pushViewController(yourViewController, animated: true)

Переход к ChildVC, этот метод не будет включать ваш TabBarView

0 голосов
/ 07 мая 2020

в обычной среде iphone панель вкладок исчезает из себя, если вы перемещаетесь ... или вы работаете в другой среде?

проверьте это:

struct ContentView: View {

    @State var hideTabbar = false
    @State var navigate = false

    var body: some View {
        NavigationView {

            TabView {

                VStack {
                    NavigationLink(destination: Text("without tab")){
                      Text("aha")
                    }
                        .tabItem {
                            Text("b")
                    }
                }.tag(0)
                Text("Second View")
                    .tabItem {
                        GeometryReader { geometry in

                            Image(systemName: "2.circle")
                            //        Text("Second")
                            Text("\(geometry.size.height) - \(geometry.size.width)")

                        }
                }.tag(1)
            }
        }
    }//.isHidden(self.hideTabbar)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...