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
}
}