SwiftUI中如何为ForEach循环内的指定按钮添加自定义修饰符
解决方案
核心问题
你当前的实现里rotationDegree是全局共享状态,且旋转修饰符的判断条件只校验了selectedNum == correctAnswer,没有和当前循环的num绑定,所以只要选中了正确答案,所有按钮都会触发旋转动画。
修改后可运行代码
@State private var rotationDegree = 0.0 @State private var selectedNum: Int? // 改成可选类型更合理,未选中时为nil,避免和0号按钮逻辑冲突 @State private var correctAnswer = 0 // 来自存储的数据 var body: some View { ForEach(0..<5) { num in Button { selectedNum = num withAnimation { // 仅点击正确答案时更新旋转角度 if num == correctAnswer { rotationDegree += 360 } } } label: { Image("imageName\(num)") } // 仅当前按钮是被选中的正确答案时,应用旋转动画 .rotation3DEffect( .degrees(num == correctAnswer && num == selectedNum ? rotationDegree : 0.0), axis: (x: 0, y: num == correctAnswer && num == selectedNum ? 1 : 0, z: 0) ) // 有按钮被选中时,未选中按钮降低透明度 .opacity(selectedNum != nil && num != selectedNum ? 0.3 : 1.0) } }
调整说明
- 把
selectedNum改成可选类型,避免默认值0和实际的0号按钮逻辑冲突 - 旋转修饰符新增
num == selectedNum判断,保证只有被点击的正确答案按钮才会响应旋转值,其余按钮不会触发动画 - 新增
opacity修饰符,只要有按钮被选中,未被选中的按钮就会自动降低透明度,符合需求
内容的提问来源于stack exchange,提问作者Aashish
相关产品推荐
相关产品推荐

