我正在使用SwiftUI的导航堆栈和选项卡栏/选项卡栏样式,在将选项卡栏样式设置为分页之前,一切都按预期进行.下面是一个例子:

代码:

struct TabsView: View {
    enum Tab {
        case home
    }
    
    @State private var selectedTab: Tab = .home
    
    var body: some View {
        TabView(selection: $selectedTab) {
            NavigationStack {
                ScrollView {
                    Text("Home Screen")
                        .navigationTitle("Home")
                        .navigationBarTitleDisplayMode(.inline)
                        .toolbar(.visible, for: .navigationBar)
                        .toolbarBackground(.visible, for: .navigationBar)
                }
            }
            .tabItem {
                Image(systemName: "square")
            }
            .tag(Tab.home)
        }
    }
}

Screenshot: enter image description here

但我一加.tabViewStyle(.page),它就断了.它不会像导航栏预期的那样占据整个高度.此外,文本现在隐藏在导航栏后面:

代码:

struct TabsView: View {
    enum Tab {
        case home
    }
    
    @State private var selectedTab: Tab = .home
    
    var body: some View {
        TabView(selection: $selectedTab) {
            NavigationStack {
                ScrollView {
                    Text("Home Screen")
                        .navigationTitle("Home")
                        .navigationBarTitleDisplayMode(.inline)
                        .toolbar(.visible, for: .navigationBar)
                        .toolbarBackground(.visible, for: .navigationBar)
                }
            }
            .tabItem {
                Image(systemName: "square")
            }
            .tag(Tab.home)
        }
        .tabViewStyle(.page)
    }
}

Screenshot: enter image description here

推荐答案

实际上,如果没有Pages选项卡样式(.tabViewStyle(.page)),则顶部和底部安全区域都被覆盖,如下所示.

enter image description here

因此,Color.red.ignoresSafeArea()完全包含在下面的代码中.

import SwiftUI

struct ContentView1: View {
    @State private var selectedTab: Tab = .home
    
    var body: some View {
        ZStack {
            Color.red.ignoresSafeArea()
            TabView(selection: $selectedTab) {
                NavigationStack {
                    ScrollView {
                        Text("Home Screen")
                            .navigationTitle("Home")
                            .navigationBarTitleDisplayMode(.inline)
                            .toolbar(.visible, for: .navigationBar)
                            .toolbarBackground(.visible, for: .navigationBar)
                    }
                }
                .tabItem {
                    Image(systemName: "square")
                }
                .tag(Tab.home)
            }
            //.tabViewStyle(.page)
        }
    }
}

另一方面,如果您使用的是Pages选项卡样式(.tabViewStyle(.page)),则会同时丢失顶部和底部安全区域,如下图所示.

enter image description here

import SwiftUI

struct ContentView2: View {
    @State private var selectedTab: Tab = .home
    
    var body: some View {
        ZStack {
            Color.red.ignoresSafeArea()
            TabView(selection: $selectedTab) {
                NavigationStack {
                    ScrollView {
                        Text("Home Screen")
                            .navigationTitle("Home")
                            .navigationBarTitleDisplayMode(.inline)
                            .toolbar(.visible, for: .navigationBar)
                            .toolbarBackground(.visible, for: .navigationBar)
                    }
                }
                .tabItem {
                    Image(systemName: "square")
                }
                .tag(Tab.home)
            }
            .tabViewStyle(.page)
        }
    }
}

所以我有一个类似的层,它的 colored颜色 接近下面TabView以上的底部安全区域.

import SwiftUI

struct ContentView3: View {
    @State private var selectedTab: Tab = .home
    
    var body: some View {
        ZStack {
            Color.black.opacity(0.03).ignoresSafeArea(edges: .top)
            TabView(selection: $selectedTab) {
                NavigationStack {
                    ScrollView {
                        Text("Home Screen")
                            .navigationTitle("Home")
                            .navigationBarTitleDisplayMode(.inline)
                            .toolbar(.visible, for: .navigationBar)
                            .toolbarBackground(.visible, for: .navigationBar)
                    }
                }
                .tabItem {
                    Image(systemName: "square")
                }
                .tag(Tab.home)
            }
            .tabViewStyle(.page)
        }
    }
}

下图显示了结果.

enter image description here

Ios相关问答推荐

如何遮罩,动画和添加阴影到CAShapeLayer?

在金属中设置纹理的UV坐标以编程方式变形纹理

@Query与SwiftData数据列表绑定

如何更改 SwiftUI 弹出视图的大小?

ITMS-90432:将应用上传到应用store 时出现问题

Swift Combine:prepend() before share() 阻止初始接收器执行

将 URLCache 子类与 URLSession 一起使用

SwiftUI - 如何从主题感知命名 colored颜色 中获取正确的 RGB 值?

使用 SceneKit 从 CapturedRoom.walls 重新创建 RoomPlan

过渡动画在 iOS16 中不起作用,但在 iOS15 中起作用

具有多个目标的应用程序的动态内容

Text() 正在添加额外的前导尾随填充 SwiftUI

DateFormatter 使用 TimeZone 和 Locale 的特定组合返回 nil

Swift如何表示单位转换的标准大气压

如何使用 sendAsynchronousRequest:queue:completionHandler:

直接下载Xcode模拟器

iOS 应用程序中的手动语言 Select (iPhone 和 iPad)

如何像在 Facebook 应用程序中一样以编程方式打开设置?

自动布局:是什么创建了名为 UIView-Encapsulated-Layout-Width & Height 的约束?

如何在 Swift 中更改按钮标题对齐方式?