因此,基本上我对SwiftUI(几天前才开始)非常陌生,我正在try 将标签设置在ScrollView以内.我正在努力实现的最终结果是Instagram的个人资料视图.

我可以想象该视图的实现如下所示:

    ScrollView {
        VStack {
            HStack {
                // Profile Pic
                // Stats
            }
            // Bio
            // Button(s)
            LazyVStack(pinnedViews: .sectionHeaders) {
                Section {
                    TabView {
                        // Tab 1
                        // Tab 2
                        // Tab 3
                    }
                } headers: {
                      // Tab icons
                }
            }
        }
    }

问题是,TabView从未出现过.此外,我不确定这是否是最好的设置,尤其是LazyVStack,因为我只使用它来固定标头.正如我之前所说的,我是SwiftUI的超级新手,所以肯定有一些我不知道存在的视图,其中一些可能对我试图实现的目标有用.

尽管如此,我如何才能实现我想要的布局呢?

谢谢!

Side Question:在我设置视图的方式下,视图的滚动条是整个视图的滚动条,但在Instagram等应用程序中,滚动条只在选项卡中.我如何才能将该方面也合并到解决方案中呢?再次感谢!

推荐答案

你在正确的轨道上.TabView当不用作根时,将失go 正确调整其大小的能力.

这就是为什么我们需要指定它的minHeight.你可以用GeometryReader来解决这个问题.

然后只需给TabView一个selection,这样Tab按钮就可以工作了,而你很可能想要应用.tabViewStyle(.page(indexDisplayMode: .never)),以便能够在它们之间滑动.

工作演示:

GeometryReader { proxy in
    ScrollView {
        VStack {
            HStack {
                Image(systemName: "person.circle")
                Text("Some Text")
            }
        }
        
        LazyVStack(spacing: 0, pinnedViews: .sectionHeaders) {
            Section {
                TabView(selection: $tabIndex) {
                    VStack {
                        Spacer()
                        Text("1")
                        Spacer()
                    }
                    .frame(maxWidth: .infinity)
                    .background(.red.opacity(0.5))
                    .tag(0)
                    
                    VStack {
                        Spacer()
                        Text("2")
                        Spacer()
                    }
                    .frame(maxWidth: .infinity)
                    .background(.green.opacity(0.5))
                    .tag(1)
                    
                    VStack {
                        Spacer()
                        Text("3")
                        Spacer()
                    }
                    .frame(maxWidth: .infinity)
                    .background(.blue.opacity(0.5))
                    .tag(2)
                }
                .tabViewStyle(.page(indexDisplayMode: .never))
                .frame(maxWidth: .infinity, minHeight: proxy.size.height)
            } header: {
                HStack {
                    Button {
                        withAnimation {
                            tabIndex = 0
                        }
                    } label: {
                        Text("Tab 1")
                    }
                    .buttonStyle(.bordered)
                    
                    Button {
                        withAnimation {
                            tabIndex = 1
                        }
                    } label: {
                        Text("Tab 2")
                    }
                    .buttonStyle(.bordered)
                    
                    Button {
                        withAnimation {
                            tabIndex = 2
                        }
                    } label: {
                        Text("Tab 3")
                    }
                    .buttonStyle(.bordered)
                }
                .padding()
                .frame(maxWidth: .infinity)
                .background(.regularMaterial)
            }
        }
    }
}

关于你的侧面问题:他们很可能仍然使用单一的滚动视图,但随后移动了滚动指示器的插页.你不能只用SwiftUI来做到这一点,但你需要反思一下底层的UIScrollView.SwiftUI-Introspect美元就够了.

然后根据您的需要调整verticalScrollIndicatorInsets

Ios相关问答推荐

在SwiftData中从@ Query创建可排序、有序和分组的数据

Swift addtarget方法的默认参数不生效

AVFoundation Camera推出变焦SWIFT

如何从Windows PC在iPhone上安装Flutter 应用程序

执行devicectl:ProcessException时出错:进程异常退出:错误:命令超时超过5.0秒

如何使用 SwiftData 从列表中删除子项目?

SwiftUI 每秒从 Timer 更新单个 @State 属性,每秒也重绘整个视图

将 URLCache 子类与 URLSession 一起使用

SwiftUI 图表 BarMark 将注释对齐到图表顶部

无法从 Xcode 获取模拟器列表.请打开 Xcode 并try 直接从那里运行项目以解决剩余问题

iOS SwiftUI - 从以前的 struct 调用函数

使用swift将图像转换为A4大小的pdf

-1103 错误域=NSURLErrorDomain 代码=-1103资源超过最大大小iOS 13

界面生成器 - 无法从路径加载设计对象(空)

在 Swift 中将 HTML 转换为纯文本

无论我将构建版本或应用程序版本更改为什么,都会出现 ITEMS-4238冗余二进制上传错误

刷新由 Xcode 7 管理的团队配置文件中的设备?

从 WKWebView 获取所有 cookie

正确的领域使用模式/最佳实践?

是否可以将 Socket.io 与 AWS Lambda 一起使用?