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

Я использовал по умолчанию navigation bar (потому что у него есть возможность разрешить смахивание, чтобы закрыть представление), но поскольку моя проблема заключается в hide NavBar в RootView и show, когда он пропадает после перехода к ChildView, я столкнулся с проблемой с моим ChildView (он подпрыгивает вверх и вниз после манипуляций с навигационной панелью). Следовательно, мне нужен custom NavBar (отлично было бы с возможностью делать смахивания, чтобы скрыть его.)

Здесь вы можете увидеть мой код и проблему с NavBar , которая была решена и вызвала тот, который вы читаете.

My RootView

struct ExploreView: View {

    var body: some View {
        ZStack{
        VStack{
            HStack{
        
                NavigationLink(destination: MessagesView()){

                         Image("messages")
                        
                      }
 
                }
            }

        }
       
        }.navigationBarTitle(Text(""), displayMode: .inline)
            .navigationBarHidden(true)
            .navigationBarBackButtonHidden(true)
   
    }
}

ChildView #

struct MessagesView: View {

    
    @Environment(\.presentationMode) var presentationMode

    var btnBack : some View {
        Button(action: {
            self.presentationMode.wrappedValue.dismiss()
        }) {
            Image(systemName: "chevron.left")
                .font(.title)
        }
    }
    
    
    var body: some View {
   
        ZStack{
            
        VStack{
            Spacer()

            HStack {
                btnBack
                    .padding(.leading, 10)


                Spacer()


                Button(action:{
                     self.show.toggle()
                 },label: {
                     Image("writemessage")
                     .foregroundColor(Color("blackAndWhite"))
                 }
                )
            }
        }
       
    
    .navigationBarBackButtonHidden(true)
    .navigationBarHidden(true)   
    
     
    }
}

1 Ответ

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

Пользовательский NavigationBar может выглядеть так. Конечно, его можно индивидуализировать с помощью цветов и размеров шрифта и т. Д. c. любым способом:

import SwiftUI

struct ContentView: View {

    var body: some View {
        NavigationView {
            VStack {
                HStack {
                    NavigationLink(destination: MessagesView()){
                        Text("Go to MessagesView")
                    }
                }
            }.navigationBarTitle(Text(""), displayMode: .inline)
                .navigationBarHidden(true)
                .navigationBarBackButtonHidden(true)
        }
    }
}

struct MessagesView: View {

    @Environment(\.presentationMode) var presentationMode

    var btnBack : some View {
        Button(action: {
            self.presentationMode.wrappedValue.dismiss()
        }) {
            Image(systemName: "chevron.left")
                .font(.title)
        }
    }

    var body: some View {

        ZStack{
            VStack{
                HStack {
                    btnBack
                        .padding(.leading, 10)
                    Spacer()
                }
                Spacer()

                Text("MessagesView")
                Spacer()
            }.navigationBarTitle(Text(""), displayMode: .inline)
                .navigationBarHidden(true)
                .navigationBarBackButtonHidden(true)
        }
    }
}

Чтобы жест Swipe-back работал даже при отключенном стандартном NavigationBar, вам понадобится какое-то дополнение под SceneDelegate:

extension UINavigationController: UIGestureRecognizerDelegate {
    override open func viewDidLoad() {
        super.viewDidLoad()
        interactivePopGestureRecognizer?.delegate = self
    }

    public func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        return viewControllers.count > 1
    }
}
...