在 SwiftUI 中,每当导航栏被隐藏时,滑动返回手势也会被禁用。
有什么办法可以在保留 SwiftUI 中的向后滑动手势的同时隐藏导航栏?我已经有一个自定义的“返回”按钮,但仍然需要手势。
我已经看到了一些 UIKit 的解决方案,但仍然不知道如何在 SwiftUI 中做到这一点
这是您自己尝试的代码:
import SwiftUI
struct RootView: View {
var body: some View {
NavigationView {
NavigationLink(destination: SecondView()) {
Text("Go to second view")
}
}
}
}
struct SecondView: View {
var body: some View{
Text("As you can see, swipe to go back will not work")
.navigationBarTitle("")
.navigationBarHidden(true)
}
}
Run Code Online (Sandbox Code Playgroud)
非常感谢任何建议或解决方案
我想添加一个自定义导航按钮,该按钮看起来会像这样:
现在,我BackButton
为此编写了一个自定义视图。将该视图用作导航栏的主要项目时,请执行以下操作:
.navigationBarItems(leading: BackButton())
Run Code Online (Sandbox Code Playgroud)
...导航视图如下所示:
我玩过类似的修饰符:
.navigationBarItem(title: Text(""), titleDisplayMode: .automatic, hidesBackButton: true)
Run Code Online (Sandbox Code Playgroud)
没有任何运气。
我怎么能够...
.navigationBarHidden(true)
我在 iOS 15 和 iOS 16 中一直使用以下扩展,似乎没有任何问题。对于上下文,我在项目中实现了此功能,以提供保留向后滑动手势的功能,以便在视图层次结构(子级到父级)中向后导航。这是因为使用后退按钮的自定义实现(出于 UI 样式目的)隐藏 SwiftUI 中的工具栏或导航栏会导致向后滑动手势丢失。
这就是这个扩展发挥作用的地方。感谢尼克·贝鲁奇的最高评价答案,我在这里找到了这一点。隐藏导航栏而不丢失 SwiftUI 中的向后滑动手势
现在的问题是,在 iOS 17.0 中,当从子视图滑回后返回到根视图时,根视图会在设备和模拟器上冻结并中断。有没有人重现或遇到过这个问题?要完全重新创建场景,只需.toolbar(.hidden)
在子视图上使用即可,或者.navigationBarBackButtonHidden()
改为使用。
还需要注意的是,我正在使用dismiss()
弹出的视图。下面的片段...您只需根据自己的喜好将自定义后退按钮放置在子视图中即可重新创建此示例。
extension UINavigationController: UIGestureRecognizerDelegate {
override open func viewDidLoad() {
super.viewDidLoad()
interactivePopGestureRecognizer?.delegate = self
}
public func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
return viewControllers.count > 1
}
}
Run Code Online (Sandbox Code Playgroud)
struct CustomBackButton: View {
@Environment(\.dismiss) var dismiss
var body: some View {
Button(action: {
dismiss()
}) {
// your pretty swiftui code here
}
}
} …
Run Code Online (Sandbox Code Playgroud)