SwiftUI中如何将GeometryReader的GeometryProxy绑定到子视图?
问题解决方案
错误原因
- 命名冲突:GeometryReader闭包内的
geometry参数名和你自定义的View结构体名完全重名,编译器会把geometry(geometry: geometry}中的第一个geometry识别为GeometryProxy类型的变量,而非你定义的View,调用非函数类型的变量自然触发该报错。Swift规范中结构体、类等类型需使用大驼峰命名,变量、属性使用小驼峰命名,即可避免这类冲突。 - 不必要的@Binding声明:
@Binding用于双向数据绑定场景,仅当父、子视图都需要修改对应值时才需要使用。而GeometryProxy是GeometryReader提供的只读上下文,仅用于读取尺寸、安全区等属性,不需要修改,直接用普通常量属性接收即可。
正确实现代码
GeometryReader { proxy in // 将GeometryProxy传入子视图 GeometryCircleView(geometry: proxy) } // 自定义View使用大驼峰命名 struct GeometryCircleView: View { // 直接用常量存储GeometryProxy,无需绑定 let geometry: GeometryProxy var body: some View { Circle() .foregroundColor(.blue) .opacity(0.5) .blur(radius: 5) .frame(width: geometry.size.width * 0.04, height: geometry.size.width * 0.04) } }
额外说明
如果需要在多层级视图间传递GeometryProxy,可将其存储到上层视图的@State属性中向下传递,依旧无需使用@Binding,因为你不需要修改GeometryProxy本身的值。
内容的提问来源于stack exchange,提问作者user16856881
相关产品推荐
相关产品推荐

