SwiftUI视图树-ViewBuilder

181 阅读1分钟

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