2

你好吗?

请考虑以下代码:

struct ContentView: View {

   var body: some View {

      NavigationView {
          GeometryReader { geometry in
              ZStack(alignment: .leading) {
                  ViewOne()
                     .frame(height: geometry.size.height / 2)
              }
          }
      }
   }
}

struct ViewOne: View {

   init() {
       print("View one init")
   }

   var body: some View {
       VStack(alignment: .center) {
           Text("This is View one")
               .font(.system(size: 50))
       }
   }
}

我的问题很简单:为什么 ViewOne 在 GeometryReader 内构建了两次,而在 GeometryReader 之外只构建了一次?

首先,我认为需要创建一次视图,然后再考虑 GeometryReader 的大小,但是,如果您在 ViewOne 中有更复杂的内容,事情就会变得一团糟。

有任何想法吗??

感谢您花时间和帮助这个 SwiftUI 朋友!

4

1 回答 1

3

这不是由于GeometryReader(考虑下面的变体或放入任何xStack),而是因为放入的所有内容都NavigationView构成了自己的复杂布局。此外,您不必依赖View.init调用了多少次 - 视图是结构、值,它可以在视图布局和渲染期间创建/复制多次(Apple 承诺使其优化,但仅此而已)。

所以,只是不要把任何重的(无关的)放入View.init(和视图中)。用于其他设计模式。

struct TestGeometryReaderBuilder: View {

   var body: some View {
          GeometryReader { geometry in
              ZStack(alignment: .leading) {
                  ViewOne()
                    .frame(height: geometry.size.height / 2)
              }
          }
    }
}

struct ViewOne: View {

   init() {
       print("ViewOne> init")
   }

   var body: some View {
       print("ViewOne> build")
       return VStack(alignment: .center) {
           Text("This is View one")
               .font(.system(size: 50))
       }
   }
}

在此处输入图像描述

于 2020-03-31T03:21:19.143 回答