【发布时间】:2020-07-22 22:10:54
【问题描述】:
我有一个嵌套在 NavigationView 中的 GeometryReader。在 GeometryReader 中,我使用 GeometryProxy 提供的尺寸和 if 语句。在我的项目中,我偶然发现了一个事实,即 GeometryReader 中的内容被评估了两次,并且第一次提供的尺寸是宽度 0 和高度 0。此外,if case 中内容的 onAppear() 方法被调用了两次,这会导致更多问题。
有人能解释一下这种行为,以便我改进我的代码吗?
我做了一个最小的例子来展示这个问题:
import SwiftUI
struct ContentView: View {
var body: some View {
NavigationView() {
NavigationLink(destination: SecondView()) {
Text("Click me!")
}
}
.navigationViewStyle(StackNavigationViewStyle())
}
}
struct SecondView: View {
private func showHorizontal(_ w: CGFloat, _ h: CGFloat) -> Bool {
print("Dimensions \(w), \(h)")
return (w > h)
}
var body: some View {
GeometryReader { proxy in
if self.showHorizontal(proxy.size.width, proxy.size.height) {
Text("Landscape")
.onAppear() {
print("Landscape appeared")
}
} else {
Text("Portrait")
.onAppear() {
print("Portrait appeared")
}
}
}
.onAppear() {
print("GeometryReader appeared")
}
}
}
在我的 iPad 上横向显示以下控制台输出:
Dimensions 0.0, 0.0
Dimensions 1194.0, 688.0
GeometryReader appeared
Landscape appeared
Landscape appeared
【问题讨论】:
-
看起来它会根据几何形状的变化进行更新,这是有道理的。
标签: ios swift swiftui navigationview geometryreader