我正在尝试使用与相似的功能来实现自定义视图TabView。我正在使用初始化显示的标签ViewBuilder。但是,这意味着当我将多个视图传递给初始化程序时,内容为TupleView。如何一次只显示其中一个视图?
struct TabbedView<Content> : View where Content : View {
@State var selected:Int = 0
var content:Content
var body: some View {
content
}
init(@ViewBuilder _ content:() -> Content) {
self.content = content()
}
}
struct TestView: View {
var body: some View {
TabbedView {
Text("A")
Text("B")
}
}
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在 SwiftUI 中,要实现这样的 TabView 功能,你需要根据选中的标签(selected
)来显示对应的内容视图。你可以通过使用 ForEach
遍历内容并根据当前选中的索引来决定显示哪个视图。这里是一个修改后的示例代码:
struct TabbedView<Content: View>: View {
@State var selected: Int = 0
@ViewBuilder var content: () -> [Content]
var body: some View {
ForEach(0 ..< content().count, id: \.self) { index in
self.content()[index]
.opacity(index == self.selected ? 1 : 0)
.onTapGesture {
self.selected = index
}
}
}
}
struct TestView: View {
var body: some View {
TabbedView {
Text("A")
Text("B")
}
}
}
在这个版本中,我做了以下更改:
content
属性更改为一个闭包,它返回一个视图数组 [Content]
,这允许你传递多个视图。ForEach
来遍历这些视图,并根据 selected
状态的值来控制每个视图的可见性(通过设置 .opacity
)。.onTapGesture
以便当用户点击任一视图时更新 selected
状态,从而切换到相应的视图。这样,每次只有一个视图会完全可见(不透明度为1),实现了你想要的标签页效果。