如何跟踪值何时更改以及何时停止拖动?

时间:2018-05-18 21:20:36

标签: ios swift events uislider

根据我使用UISlider的经验,我为ValueChanged事件创建了IBAction。现在,根据我isContinuous设置的方式,它会在值更改或拖动停止时触发。我的问题是我需要跟踪两种情况,但我无法设置isContinuous两种方式。

有什么方法可以跟踪更改的值和用户何时停止拖动?我希望在值连续变化时更新计数器,并且,我想在拖动停止时刷新数据。我不想刷新每个值更改的数据,因为它会导致过多的开销。我尝试了其他几个动作,但拖动停止时没有一个被调用。

1 个答案:

答案 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会触发我们的目标。因此,对于每次更改,我们都会排队等待稍后执行的闭包,并每次检查滑块中是否有任何活动的识别器。如果没有,则拖动手势已经完成,我们可以放心地假设用户拉起了手指。