SwiftUI - 禁用 NavigationView 返回按钮菜单

3

所以,我有以下代码:

struct ContentView: View {
    var body: some View {
        NavigationView {
            NavigationLink("Page", destination: PageView())
                .font(Font.system(.largeTitle))
        }
    }
}

struct PageView: View {
    var body: some View {
        Text("Hello, world!")
    }
}

当选择“页面”导航链接时,您将被重定向到新屏幕(PageView)。当您长按(按住)返回按钮以返回主屏幕(ContentView)时,会出现一个菜单(iOS14+的新功能):

enter image description here

有没有一种方法可以使用SwiftUI(不添加自定义返回按钮)来禁用长按手势上的菜单弹出窗口?祝大家好运,感谢您的时间!
2个回答

1
我找到了一个解决方法。虽然不太美观,但它有效^^。
一开始我试图使用Introspect库来改变底层的UIKit组件,因为有一个Solution可以解决UIKit的问题。但结果并不理想。
所以这里就出现了解决方法。
思路
用一个无形视图覆盖返回按钮,该视图具有相同的点击手势,但没有长按菜单。
解决方案
独立于用户设备类型,找到并到达返回按钮的确切位置。

代码:

struct ContentView: View {
    
    @State private var showPageView = false
    
    var body: some View {
        NavigationView {
            NavigationLink("Page", destination: PageView(), isActive: $showPageView)
                .font(Font.system(.largeTitle))
        }
        .overlay(NavigationBackButtonHiddenTouchView(isActive: $showPageView))
    }
}

struct PageView: View {
    
    var body: some View {
        ZStack {
            Text("Hello, world!")
        }
    }
}

struct NavigationBackButtonHiddenTouchView: View {
    
    @Binding var isActive: Bool
    
    var body: some View {
        VStack {
            HStack {
                Color.black.opacity(0.0000001).frame(width: 80, height: 35)
                    .onTapGesture { isActive = false }
                
                Spacer()
            }
            .frame(height: navBarHeight)
            
            Spacer()
        }
    }
    
    var navBarHeight: CGFloat = {
        return UINavigationController().navigationBar.frame.size.height
    }()
}

问题

使其可重用于进一步的导航链接(您需要手动处理,虽然丑陋但可行)。

如果它引起复杂性,您还可能需要处理隐藏NavigationBackButtonHiddenTouchView从您的父视图中。


1

是的!这是一个解决方案。干得好。唯一的问题是,你没有在按钮上有点击指示。我稍微整理了一下代码:

struct BackButtonMenuDisabled: ViewModifier {
private enum Constants {
    static let overlayOpacity = 0.01
    static let backButtonWidth: CGFloat = 50
}

@Binding private var isActive: Bool

init(isActive: Binding<Bool>) {
    self._isActive = isActive
}

private var navigationBarHeight: CGFloat {
    UINavigationController().navigationBar.frame.size.height
}

func body(content: Content) -> some View {
    content.overlay(
        VStack {
            HStack {
                Color.black.opacity(Constants.overlayOpacity)
                    .frame(width: Constants.backButtonWidth, height: navigationBarHeight)
                    .onTapGesture {
                        isActive = false
                    }
                Spacer()
            }
            Spacer()
        }
    )
}

太好了!嗯,我明白了。您可以为工具栏按钮项的tintColor创建自定义动画。但是访问它可能会有些困难。 - Kai Zheng

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接