PageTabViewStyle 打破 NavigationView
Posted
技术标签:
【中文标题】PageTabViewStyle 打破 NavigationView【英文标题】:PageTabViewStyle breaks NavigationView 【发布时间】:2020-09-28 22:55:22 【问题描述】:我正在开发一个 SwiftUI 视图。在 TabView 中使用 NavigationView 时,应用按预期工作。
struct ContentView: View
var body: some View
TabView
NavigationView
Text("A")
.navigationBarTitle("Nav A")
.frame(maxWidth: .infinity, maxHeight: .infinity)
NavigationView
Text("B")
.navigationBarTitle("Nav B")
.frame(maxWidth: .infinity, maxHeight: .infinity)
//.tabViewStyle(PageTabViewStyle(indexDisplayMode: .never)) // this line breaks the view
一旦我取消注释.tabViewStyle(...)
,视图就无法按预期工作。任何想法为什么?文本不再可见。导航似乎也不正确。
【问题讨论】:
【参考方案1】:尝试将NavigationView
移到TabView
之外:
struct ContentView: View
@State var selection = 1
var body: some View
NavigationView
TabView(selection: $selection)
Text("A").tag(1)
Text("B").tag(2)
.tabViewStyle(PageTabViewStyle(indexDisplayMode: .never))
.navigationTitle(selection == 1 ? "A" : "B")
【讨论】:
你是对的。然而,这会导致不同的问题。我将 NavigationView 放在 TabView 中,因为我在 NavigationView 中有一个 ScrollView。当我现在将 ScrollView 放入 TabView 时,NavigationView 不再响应滚动。 (例如更改标题大小)。对此有何想法? @Finn 您没有在问题中提到 ScrollView,这改变了整个上下文。请创建一个新问题,我会尽力帮助您。并且不要忘记准确描述您的整个堆栈(包括 ScrollView 和其他可能重要的元素)。 谢谢。我认为 TabView 的内容无关紧要,所以我将其删除。这里是新的question。【参考方案2】:NavigationView
似乎默认显示为主/细节显示。
您可以使用修饰符 .navigationViewStyle(StackNavigationViewStyle())
强制它像普通导航堆栈一样工作
它在您的代码中:
struct ContentView: View
var body: some View
TabView
NavigationView
Text("A")
.navigationBarTitle("Nav A")
.navigationViewStyle(StackNavigationViewStyle())
.frame(maxWidth: .infinity, maxHeight: .infinity)
NavigationView
Text("B")
.navigationBarTitle("Nav B")
.navigationViewStyle(StackNavigationViewStyle())
.frame(maxWidth: .infinity, maxHeight: .infinity)
.tabViewStyle(PageTabViewStyle(indexDisplayMode: .never))
【讨论】:
以上是关于PageTabViewStyle 打破 NavigationView的主要内容,如果未能解决你的问题,请参考以下文章
在 TabView 中设置 SwiftUI PageTabViewStyle 垂直流向
带有 PageTabViewStyle 的 TabView 屏幕中的背景不会填满整个可用的垂直空间
SwiftUI TabView 与 PageTabViewStyle 在设备上的横向与 safeArea 添加奇数前沿插图
在 PageTabViewStyle (SwiftUI 2.0) 或 PageViewController/PageView (带有 UIKit 界面) 上显示部分上一个和下一个项目