SwiftUI是如何构建视图的?
使用一种特殊的视图构建器(view builder)语法来构建视图列表,view builder是建立在Swfit的结果构建器(result builder)特性之上的。新建SwiftUI的项目中,Apple提供的默认contentView里的VStack视图
VStack {
Image(systemName: "globe")
Text("Hello, world!")
}
VStack接受一个闭包作为参数,这个闭包被标记为了@ViewBuilder,这就允许我们在闭包里写多个view构建的表达式,这些view就成为VStack的子视图。
**@inlinable** **public** **init**(alignment: VerticalAlignment = .center, spacing: CGFloat? = **nil**, @ViewBuilder content: () -> Content)
进一步查看ViewBuilder的结构体声明,可以看到
static func buildBlock<each Content>(_ content: repeat each Content) -> [`TupleView`]()<(repeat each Content)> where repeat each Content : [`View`]()
传入多个子视图(此处看到的还是content,类似一个config,后面会看到如何直接使用ViewBuilder构建view的说明),回传的是一个TupleView类型,代表了一个视图的列表。
将属性标记为 @ViewBuilder
将属性标记为@ViewBuilder,就可以像在body或者VStack、Grid...的闭包中所做的那样,在属性的主体中使用视图构建器的语法
struct ContentView: View {
@ViewBuilder var hello: some View {
Image(systemName: "hand.wave")
Text("Hello")
}
@ViewBuilder var bye: some View {
Text("And Goodbye!")
Image(systemName: "hand.wave")
}
var body: some View {
HStack {
hello
Spacer()
bye
}
}
}
这在将复杂布局进行拆解时将很有用,此时body的view布局为 TupleView + Spacer + TupleView