- 1、自定义preferenceKey
struct RectangleGeometrySizePreferenceKey: PreferenceKey {
static var defaultValue: CGSize = .zero
static func reduce(value: inout CGSize, nextValue: () -> CGSize) {
value = nextValue()
}
}
- 2、扩展View添加方法
extension View {
func updateRectangleGeoSize(_ size: CGSize) -> some View {
preference(key: RectangleGeometrySizePreferenceKey.self, value: size)
}
}
- 3、使用例子
struct GeometryPreferenceBootCamp: View {
// MARK: - PROPERTY
@State private var rectSize: CGSize = .zero
// MARK: - BODY
var body: some View {
VStack(spacing: 50) {
Text("Hello")
.frame(width: rectSize.width, height: rectSize.height)
.background(Color.blue)
HStack {
Rectangle()
GeometryReader { geo in
Rectangle()
.updateRectangleGeoSize(geo.size)
}
Rectangle()
}
.frame(height: 55)
} //: VSTACK
.onPreferenceChange(RectangleGeometrySizePreferenceKey.self) { value in
self.rectSize = value
}
}
}
-
4、效果图