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

使用SwiftFortuneWheel修改转盘切片颜色后停止索引异常咨询

问题根因

你在旋转动画结束后全量替换了SwiftFortuneWheel的slices数组,该库内部在接收新的slices数组时会自动重置转盘的旋转角度为初始值,导致原本已经停止在正确位置的转盘发生偏移,后续额外调用的rotate(toIndex:)方法进一步加重了位置错位。

修复方案

两种可选修复方式,推荐第二种性能更优:

  • 方案1:保留现有生成切片的逻辑,替换切片后恢复原有旋转角度,删除多余旋转调用
    修正后的rotateTap回调代码如下:
@IBAction func rotateTap(_ sender: Any) {
    let finishingIndex = self.finishIndex
    print(finishingIndex)
    wheelControl.startRotationAnimation(finishIndex: finishingIndex, continuousRotationTime: 1) { [weak self] (isFinished) in
        guard let self = self, isFinished else { return }
        print(self.prizes[finishingIndex])
        self.selectedIndex = finishingIndex
        // 记录动画停止时的正确旋转角度
        let correctRotationAngle = self.wheelControl.rotationAngle
        self.updateSlice()
        self.wheelControl.slices = self.slices
        // 直接恢复原有角度,无需再次旋转
        self.wheelControl.rotationAngle = correctRotationAngle
    }
}
  • 方案2:不重新生成切片数组,直接修改现有切片的背景色,从根源避免触发角度重置
    可以删掉原有updateSlice的全量生成逻辑,直接在动画结束后修改切片属性:
@IBAction func rotateTap(_ sender: Any) {
    let finishingIndex = self.finishIndex
    print(finishingIndex)
    wheelControl.startRotationAnimation(finishIndex: finishingIndex, continuousRotationTime: 1) { [weak self] (isFinished) in
        guard let self = self, isFinished else { return }
        print(self.prizes[finishingIndex])
        // 直接遍历修改现有切片的背景色
        for (index, prize) in self.prizes.enumerated() {
            self.wheelControl.slices[index].backgroundColor = index == finishingIndex ? prize.winningColor : prize.losingColor
        }
        // 触发转盘重绘即可
        self.wheelControl.setNeedsDisplay()
    }
}

内容的提问来源于stack exchange,提问作者Syed Faraz Haider Zaidi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 06:39:03