你好吗?
请考虑以下代码:
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朋友的帮助!
答案 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))
}
}
}