gpt4 book ai didi

ios - SwiftUI GeometryReader 使其内容加载两次

转载 作者:行者123 更新时间:2023-12-01 16:01:16 26 4
gpt4 key购买 nike

你好吗?

请考虑以下代码:

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 之外只构建了一次?

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

有任何想法吗??

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

最佳答案

这不是由于 GeometryReader (考虑下面的变体或放入任何 xStack 中),这是因为放入 NavigationView 中的所有内容,这使得自己的复杂布局。而且你没有依赖多少次View.init被称为 - View 是结构,值,它可以在 View 布局和渲染期间多次创建/复制(Apple promise 使其优化,但仅此而已)。

所以,不要在 View.init 中添加任何重的(无关的)内容。 (并且完全进入 View )。用于其他设计模式。

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

关于ios - SwiftUI GeometryReader 使其内容加载两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60941289/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com