我在 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) 交互式弹出手势识别器应允许用户在滑过屏幕的一半以上(或这些行周围的内容)时返回导航堆栈中的上一个视图。在SwiftUI中,如果滑动距离不够远,手势不会被取消。
SwiftUI: https ://imgur.com/xxVnhY7
UIKit: https ://imgur.com/f6WBUne
题:
使用SwiftUI视图时能否获得UIKit行为?
尝试次数
我试图将UIHostingController嵌入UINavigationController内,但其行为与NavigationView完全相同。
struct ContentView: View {
var body: some View {
UIKitNavigationView {
VStack {
NavigationLink(destination: Text("Detail")) {
Text("SwiftUI")
}
}.navigationBarTitle("SwiftUI", displayMode: .inline)
}.edgesIgnoringSafeArea(.top)
}
}
struct UIKitNavigationView<Content: View>: UIViewControllerRepresentable {
var content: () -> Content
init(@ViewBuilder content: @escaping () -> Content) {
self.content = content
}
func makeUIViewController(context: Context) -> UINavigationController {
let host = UIHostingController(rootView: content())
let nvc = UINavigationController(rootViewController: host)
return nvc
}
func updateUIViewController(_ uiViewController: UINavigationController, …Run Code Online (Sandbox Code Playgroud) 如果我设置一个自定义后退按钮(每个人都想要,隐藏丑陋的文本 ;-) )并使用 .navigationBarBackButtonHidden,导航控制器上的标准向后滑动手势不起作用。有没有办法让这个回来并有一个自定义的后退按钮?
例如:
NavigationView {
NavigationLink(destination: DummyViewer())
{
Text("Go to next view"
}
}
Run Code Online (Sandbox Code Playgroud)
struct DummyViewer: View {
@Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
var body: some View {
Text("Hello, World!").navigationBarBackButtonHidden(true)
.navigationBarItems(leading:
Button(action: { self.presentationMode.wrappedValue.dismiss()}) {
Text("Custom go back")
}
)
}
}
Run Code Online (Sandbox Code Playgroud)
如果我这样做,我将无法返回到之前的视图,似乎手势被禁用了......如何取回它?
BR史蒂芬
我使用 aNavigationLink从“View1”导航到“View2”,在第二个视图上,后退按钮获取上一个视图的标题
但是,如果前一个视图的标题很长,则后退按钮将获取文本“后退”
我怎么能改变那个“返回”文本?
我想让我的应用程序以多种语言提供,但是当手机的语言改变时,“返回”似乎没有改变
struct ContentView: View {
var body: some View {
return NavigationView {
VStack {
Text("View1")
NavigationLink(destination: Text("View2").navigationBarTitle("Title View2", displayMode: .inline)) {
Text("NavigationLink")
}
}.navigationBarTitle("Title View1")
}
}
}
Run Code Online (Sandbox Code Playgroud)
PS:我想保留这个功能,我只想更改用于后退按钮的语言