SwiftUI:如何将TextField绑定的变量传递给自定义Shape结构体?
解决方法
- 给自定义Shape添加接收角度的属性
修改DrawPanel结构体,添加存储属性接收外部传入的tiltAngle,同时将依赖该值计算的tilt改为计算属性,确保值变化时能动态更新:
struct DrawPanel: Shape { // 接收外部传入的倾斜角度 let tiltAngle: Double private let radians = Double.pi / 180 // 动态计算cos值,依赖tiltAngle变化自动更新 private var tilt: Double { cos(tiltAngle * radians) } // 实现Shape协议的path方法 func path(in rect: CGRect) -> Path { var path = Path() // 示例:基于tilt值绘制线条,可根据需求修改 path.move(to: CGPoint(x: rect.minX, y: rect.midY)) path.addLine(to: CGPoint(x: rect.maxX, y: rect.midY + tilt * 50)) return path } }
- 在视图中传入
tiltAngle给DrawPanel
在包含@State变量的视图里,创建DrawPanel实例时将tiltAngle作为参数传入:
struct ContentView: View { @State var tiltAngle: Double = 0.0 private let formatter = NumberFormatter() init() { formatter.numberStyle = .decimal } var body: some View { VStack { TextField("Tilt Angle", value: $tiltAngle, formatter: formatter) .textFieldStyle(RoundedBorderTextFieldStyle()) .padding() DrawPanel(tiltAngle: tiltAngle) .frame(width: 300, height: 200) .border(Color.black) } } }
关键说明
- 自定义Shape是独立结构体,无法直接访问视图的
@State变量,必须通过属性传参的方式将外部值传入。 - 将
tilt定义为计算属性而非存储属性,这样每次tiltAngle更新时,tilt会自动重新计算,保证绘制内容同步更新。 - 使用
Double.pi替代硬编码的3.14159,代码更规范且精度更高。
内容的提问来源于stack exchange,提问作者Edward Hasted
相关产品推荐
相关产品推荐

