如何在滑动Slider时停止触发AnimatedChart实时重绘?
解决Slider滑动过程中AnimatedChart持续重绘的问题
有两种常见方案可以实现只在Slider停止滑动后才更新AnimatedChart,根据你的需求选择即可:
方案一:直接禁用Slider的连续更新
利用Slider的isContinuous参数,将其设为false。这样Slider仅在用户停止滑动(松开手指)时才会更新绑定的daySlider值,AnimatedChart自然不会在滑动过程中频繁重绘。
修改后的Slider代码:
Slider(value: $daySlider, in: 0...364, isContinuous: false) .accentColor(Color.blue)
注意:这种方式下,Slider的进度条在滑动过程中不会实时跟随手指移动,只会在松手后跳转到目标位置。
方案二:保留Slider实时显示,仅在滑动结束时更新Chart
如果你需要Slider在滑动过程中实时显示进度,但希望AnimatedChart只在滑动停止后更新,可以借助临时变量和onEditingChanged回调实现:
- 添加一个临时状态变量存储滑动过程中的临时值
- Slider绑定临时变量,通过
onEditingChanged监听滑动状态,仅在滑动结束时更新真正的daySlider值
完整代码示例:
@State private var tempDaySlider = 0.0 @State private var daySlider = 0.0 var body: some View { VStack(alignment: .leading, spacing: 12) { AnimatedChart() // 该Chart依赖daySlider的值 } HStack { Slider(value: $tempDaySlider, in: 0...364, onEditingChanged: { isEditing in // 当滑动停止(isEditing变为false)时,更新真正的绑定值 if !isEditing { daySlider = tempDaySlider } }) .accentColor(Color.blue) } }
这种方式下,Slider会实时响应滑动操作显示进度,但AnimatedChart只会在用户松手后才触发重绘。
内容的提问来源于stack exchange,提问作者Edward Hasted
相关产品推荐
相关产品推荐

