微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SwiftUI - 禁用 NavigationView 后退按钮菜单 想法解决方案问题

如何解决SwiftUI - 禁用 NavigationView 后退按钮菜单 想法解决方案问题

所以,我有以下代码

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(不添加自定义后退按钮)

祝大家干杯,感谢您的时间!

解决方法

我找到了解决方法。不漂亮,但它有效^^。

首先,我尝试使用 Introspect 库来更改基础 UIKit 组件,因为您的问题 UIKit 存在 Solution。但结果并不好。

所以解决方法来了。

想法

使用具有相同点击手势的不可见视图覆盖后退按钮,但无需长按菜单。

解决方案

找出并到达与用户设备类型无关的后退按钮的确切位置。

代码:

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,如果这会导致复杂情况。

,

是的!这是一个解决方案。不错的工作。唯一的问题是,您在按钮上没有点击指示。我已经清理了一些代码:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。