如何在自定义视图中读取子元素中使用的modifier的值,我想达到类似TabView的效果?
struct TabItem: View {
var body: some View {
TabView {
View1()
.tabItem {
Label("Menu", systemImage: "list.dash")
}
View2()
.tabItem {
Label("Order", systemImage: "square.and.pencil")
}
}
}
}
字符串
我希望父视图(即我的CustomView)读取子元素是否有自定义修饰符(例如.inCustomView),并从中读取内容,并基于它创建按钮或其他内容,就像TabView一样
2条答案
按热度按时间ia2d9nvy1#
你需要使用一些带下划线前缀的API来读取
ViewBuilder
中的视图。然后你可以使用你自己的trait键来读取视图trait,同样使用带下划线前缀的API。trait可以存储一个AnyView
,代表传递给你的自定义修饰符的视图。要从
ViewBuilder
中提取视图,你可以使用Swift包View Extractor。你可以看看他们是如何做到这一点的-这不是很多代码。作为一个例子,让我们创建一个
VStack
,它允许你使用自定义修饰符vstackButtonLabel
在它的子视图的底部添加按钮。用户可以使用它来指定他们想要的按钮标签的视图。字符串
VStackButtonLabelTrait
是_ViewTraitKey
:型
示例用法:
型
测试结果:
x1c 0d1x的数据
作为另一个例子,这里有一个非常简单的“选项卡视图”(如果你可以这样称呼它的话),它允许你使用选择器来选择选项卡。
型
np8igboo2#
若要实现所需的效果,其中父视图CustomView可以读取其子元素中使用的修饰符的值,可以使用以下方法:
1.创建自定义TabItem修改器:
字符串
1.在CustomView中,添加一个首选项读取器以读取自定义选项卡项的大小:
型
1.在子视图中,使用
customTabItem
修饰符将自定义修饰符应用于选项卡项:型
通过这种方法,CustomView可以读取其子元素中使用的自定义选项卡项的大小,并根据该信息创建按钮或其他内容。
我希望这对你有帮助!