SwiftUI GeometryReader使其内容加载两次

时间:2020-03-30 23:43:32

标签: ios swiftui geometryreader

你好吗?

请考虑以下代码:

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朋友的帮助!

1 个答案:

答案 0 :(得分: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))
       }
   }
}

enter image description here