使用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
相关产品推荐
相关产品推荐

