Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/453.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swiftui 如何创建自定义导航栏Swift UI?_Swiftui - Fatal编程技术网

Swiftui 如何创建自定义导航栏Swift UI?

Swiftui 如何创建自定义导航栏Swift UI?,swiftui,Swiftui,我一直在使用默认的导航栏(因为它能够启用滑动来关闭视图),但由于我的问题是在根视图中隐藏导航栏,并且在导航到子视图后显示,因此我的子视图面临一个问题(在使用导航栏进行操作后,它会上下弹跳)。因此,我需要一个自定义导航栏(完全可以通过滑动来隐藏它。) 在这里,你可以看到我的代码,这是解决和触发一个你正在阅读 我的根视图 儿童视图# 自定义导航栏可以如下所示。当然,它可以根据颜色和字体大小等进行个性化设置。您可以选择任何方式: import SwiftUI struct ContentView:

我一直在使用默认的
导航栏
(因为它能够启用滑动来关闭视图),但由于我的问题是
根视图
中隐藏
导航栏
,并且
在导航到
子视图
后显示
,因此我的
子视图
面临一个问题(在使用导航栏进行操作后,它会上下弹跳)。因此,我需要一个
自定义导航栏
(完全可以通过滑动来隐藏它。)

在这里,你可以看到我的代码,这是解决和触发一个你正在阅读

我的根视图 儿童视图#
自定义导航栏可以如下所示。当然,它可以根据颜色和字体大小等进行个性化设置。您可以选择任何方式:

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)
        }
    }
}
要在禁用标准导航栏的情况下仍保持向后滑动手势的工作状态,您需要在ScenedLegate下添加一些内容:

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

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

谢谢。第一个问题是:我应该在
ChildView
RootView
hideNavbar
吗?第二个问题:我应该把这个扩展放在哪里(在场景代理中)?它告诉
声明仅在文件范围内有效
。第三:我使用
@Binding
连接从RootView到ChildView的Navlink,它不会向后导航。有什么想法吗?1.如果使用此概念,我会将NavBar隐藏在任何地方。2.扩展名应位于SceneDelegate的底部。在您最后一个}下。3.self.presentationMode.wrappedValue.Disclose()使您返回,这是backBtn的一部分。在简单的用例中不需要绑定。如果您出于其他原因需要它,请在“返回”按钮的操作中切换()它。感谢您的回答!不幸的是,没有任何效果。滑动和按钮都不起作用。(但反弹问题消失)我添加了
根视图和子视图的完整代码
请参见我编辑的上述两个代码块的答案。在iPhone XS模拟器上进行了测试。谢谢你,你是最好的。让我免于数小时的研究和解决bug!
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)
        }
    }
}
extension UINavigationController: UIGestureRecognizerDelegate {
    override open func viewDidLoad() {
        super.viewDidLoad()
        interactivePopGestureRecognizer?.delegate = self
    }

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