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的主要内容,如果未能解决你的问题,请参考以下文章

PageTabViewStyle 显示列表,而不是轮播

在 TabView 中设置 SwiftUI PageTabViewStyle 垂直流向

带有 PageTabViewStyle 的 TabView 屏幕中的背景不会填满整个可用的垂直空间

SwiftUI TabView 与 PageTabViewStyle 在设备上的横向与 safeArea 添加奇数前沿插图

在 PageTabViewStyle (SwiftUI 2.0) 或 PageViewController/PageView (带有 UIKit 界面) 上显示部分上一个和下一个项目

SwiftUI 中的双向无限 PageView