You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 19:36:03