SwiftUI:ForEach中为Shape设置不同描边颜色和线宽失效
SwiftUI:ForEach绘制多Shape时样式统一问题解决
你的问题根源在于使用数组索引作为ForEach的id,SwiftUI无法正确区分每个视图实例,导致所有Shape复用了首个元素的线宽和颜色配置。
修复步骤:
- 封装统一的数据模型
将路径、线宽、颜色打包为一个遵循Identifiable的结构体,确保每个元素拥有唯一标识:
struct ShapeItem: Identifiable { let id = UUID() var path: Path var lineWidth: Double var color: Color }
- 重构视图代码
用统一的模型数组替代三个独立数组,让ForEach直接遍历模型元素:
struct MyView: View { @State private var shapeItems: [ShapeItem] = [] var body: some View { ZStack { ForEach(shapeItems) { item in MyShape(path: item.path) .stroke(item.color, lineWidth: item.lineWidth) } } } }
- 初始化示例数据
替换原来的三个数组初始化,改用模型数组:
@State private var shapeItems: [ShapeItem] = [ ShapeItem(path: yourFirstPath, lineWidth: 4.0, color: .red), ShapeItem(path: yourSecondPath, lineWidth: 10.0, color: .blue), ShapeItem(path: yourThirdPath, lineWidth: 20.0, color: .yellow) ]
原理说明
使用索引作为id时,SwiftUI仅通过索引值识别视图。当数组元素数量未变化时,视图刷新会复用现有实例,导致样式无法正确绑定到对应元素。而Identifiable模型的唯一id能让SwiftUI精准匹配每个视图与对应数据,确保样式一一对应。
内容的提问来源于stack exchange,提问作者A. Basit
相关产品推荐
相关产品推荐

