如何解决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+ 中的新功能):
有没有办法在长按手势上禁用菜单弹出窗口,使用 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 举报,一经查实,本站将立刻删除。