根据我使用UISlider的经验,我为ValueChanged
事件创建了IBAction。现在,根据我isContinuous
设置的方式,它会在值更改或拖动停止时触发。我的问题是我需要跟踪两种情况,但我无法设置isContinuous
两种方式。
有什么方法可以跟踪更改的值和用户何时停止拖动?我希望在值连续变化时更新计数器,并且,我想在拖动停止时刷新数据。我不想刷新每个值更改的数据,因为它会导致过多的开销。我尝试了其他几个动作,但拖动停止时没有一个被调用。
答案 0 :(得分:1)
我高度支持Allen R's accepted answer;它在每个级别都是正确的,不仅提供了令人满意的答案,而且超出了范围,可以教那些在开发iOS应用程序时没有遇到或考虑过将事件合并为单一通知形式的人。
对于像我一样需要一个简单解决方案,又不想陷入Timer
的混乱局面的人们,这是我想出的解决方案之后执行一些代码,用户将手指从UISlider
上抬起:
@objc private func rssiSliderChanged(sender: UISlider?) {
// Value has changed.
DispatchQueue.main.asyncAfter(deadline: .now() + 1.5) { [weak self] in
let activeRecognisers = sender?.gestureRecognizers?.filter { $0.state == .changed }
guard activeRecognisers?.isEmpty ?? true else { return }
// Code to execute when the user finishes changing the UISlider's value.
}
}
说明:每当用户拖动UIGestureRecognizer
时,就有UISlider
会触发我们的目标。因此,对于每次更改,我们都会排队等待稍后执行的闭包,并每次检查滑块中是否有任何活动的识别器。如果没有,则拖动手势已经完成,我们可以放心地假设用户拉起了手指。