下面的代码有什么问题,尽管修饰符设置为高度 60,但viewSize
高度仍然为零?frame
struct TestGeometryModifierView: View {
@State var viewSize:CGSize = .zero
var body: some View {
Color.red
.onGeometryChange(for: CGSize.self) { proxy in
proxy.size
} action: { newValue in
viewSize = newValue
print("View Size \(newValue)")
}
.frame(height:viewSize.height)
}
}
#Preview {
TestGeometryModifierView()
.frame(height:60)
}
控制台上的打印语句仅显示一行。我预计当在视图上设置框架高度时它会改变。
View Size (402.0, 0.0)
A
Color
是贪婪的,会占用尽可能多的空间。但是,您还使用设置高度.frame
,并且此高度初始化为零。因此,在初始显示时,宽度尽可能宽,但高度为零。因此,您测量的高度
.onGeometryChange
为零,换句话说,状态变量的初始化值。由于尺寸没有改变,.onGeometryChange
因此不会再次触发。您在周围视图上设置的高度 60 对您正在测量的视图没有影响
.onGeometryChange
。因此,此附加.frame
修饰符不会导致.onGeometryChange
触发。如果您尝试测量可用的全部尺寸,那么您可以使用状态变量的可选项:
.onGeometryChange
由于初始大小与修改器设置的大小相同,因此修改器仍然只会触发一次.frame
。但现在,状态变量测量了一个有用的值: