【问题标题】:SwiftUI - disable NavigationView back button menuSwiftUI - 禁用 NavigationView 后退按钮菜单
【发布时间】:2021-01-26 18:55:23
【问题描述】:

所以,我有以下代码:

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!")
    }
}

When the "Page" NavigationLink is selected, you are redirected to a new screen (PageView).当您长按(按住)返回按钮返回主屏幕(ContentView)时,会出现一个菜单(iOS14+ 中的新功能):

有没有办法在长按手势上禁用菜单弹出,使用 SwiftUI(不添加自定义后退按钮)

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

【问题讨论】:

    标签: swiftui menu back-button navigationview


    【解决方案1】:

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

    首先,我尝试使用Introspect 库来更改底层UIKit 组件,因为Solution 有一个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,如果这会导致并发症。

    【讨论】:

      【解决方案2】:

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

      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 制作自定义动画。但是访问它会很有挑战性。
      猜你喜欢
      • 2020-12-05
      • 2021-03-18
      • 2020-03-13
      • 2021-01-31
      • 2020-05-06
      • 2023-01-24
      • 2019-10-27
      • 2021-01-30
      • 1970-01-01
      相关资源
      最近更新 更多