如何同时追踪UISlider的值变化与拖拽停止事件?
解决UISlider同时追踪连续值变化和拖拽停止的需求
这个需求我之前做项目时刚好碰到过,其实不用被isContinuous的二选一限制住,咱们可以通过监听UISlider的两个不同事件,分别处理连续值更新和拖拽停止后的操作,完美满足你的需求:
核心思路
- 把UISlider的
isContinuous设为true,让ValueChanged事件在滑块拖拽过程中持续触发,用来处理实时更新计数器的逻辑。 - 额外监听
TouchUpInside和TouchUpOutside事件,这两个事件会在用户松开滑块(无论手指在滑块范围内还是外)时触发,专门用来处理拖拽停止后的大数据刷新操作,避免频繁调用带来的性能开销。
代码示例(Swift)
首先在视图加载时添加事件监听:
override func viewDidLoad() { super.viewDidLoad() // 开启连续触发,让ValueChanged实时响应 slider.isContinuous = true // 绑定ValueChanged事件,处理计数器更新 slider.addTarget(self, action: #selector(sliderValueChanged(_:)), for: .valueChanged) // 绑定触摸结束的两个事件,处理拖拽停止后的刷新 slider.addTarget(self, action: #selector(sliderDragEnded(_:)), for: [.touchUpInside, .touchUpOutside]) }
然后实现对应的处理方法:
@objc private func sliderValueChanged(_ sender: UISlider) { // 这里写连续值变化时的计数器更新逻辑 counterLabel.text = String(format: "当前数值:%.1f", sender.value) } @objc private func sliderDragEnded(_ sender: UISlider) { // 这里写拖拽停止后的大数据刷新逻辑,比如请求接口、更新列表等 refreshData(with: sender.value) }
代码示例(Objective-C)
如果是OC项目,写法类似:
- (void)viewDidLoad { [super viewDidLoad]; self.slider.continuous = YES; [self.slider addTarget:self action:@selector(sliderValueChanged:) forControlEvents:UIControlEventValueChanged]; [self.slider addTarget:self action:@selector(sliderDragEnded:) forControlEvents:UIControlEventTouchUpInside | UIControlEventTouchUpOutside]; } - (void)sliderValueChanged:(UISlider *)sender { self.counterLabel.text = [NSString stringWithFormat:@"当前数值:%.1f", sender.value]; } - (void)sliderDragEnded:(UISlider *)sender { [self refreshDataWithValue:sender.value]; }
为什么这个方案可行?
isContinuous = true保证了拖拽过程中ValueChanged实时触发,满足计数器实时更新的需求。TouchUpInside和TouchUpOutside覆盖了所有用户停止拖拽的场景:不管用户是在滑块上松开手指,还是拖拽到滑块区域外再松开,都会触发其中一个事件,确保我们能准确捕捉到拖拽停止的时机,这时再执行高开销的刷新操作就不会有性能问题了。
内容的提问来源于stack exchange,提问作者Lastmboy
相关产品推荐
相关产品推荐

