Ekulelu's Blog

iOS进度条拖动后释放抖动问题的解决

iOS的UISlider把在稍微有拖动的时候就会触发UIControlEventValueChanged这个事件,监听这个事件就可以得到当前Slider的value。但是当使用者拖动后抬起手的时候,经常会有轻微的抖动出现。这个抖动一般很难小于进度条最大值的0.1%。对于音量一些最大值不是很大的场景来讲,0.1%的误差可以接受。但是对于视频进度控制这种情况来讲,0.1%的误差在看电影的时候会显得很大。90分钟的视频,就是5400秒,它的0.1%就是5s,而且这个0.1%也是很难做到,一般的滑动会大于这个值。更要命的是,拖动的时候还显示了当前拖动的位置,但这个显示会在你松手的一刻突然变化,然后消失。用户根本来不及看最后的值,它只能看到他放手前一刻的值,但你视频跳转的时间就不对,经常会差了20多秒。

为了解决这个问题,结合iOS进度条的调用特性,给出了这样一个方法:在valueChange的回调函数中保存最近出现过的几个值(这里选择记录6个),并统计每个值出现的次数。当用户最终松手后,去遍历这几个值,找出出现次数最多的那个值,这个值一般就是用户松手前的那一个值。因为当用户真正想准确地拖动到某个位置的时候,他往往会在这个位置附件停留比较久,导致这个位置的值会多次传入到valueChange的回调函数中。对于随便一拖就放这种情况,用户根本不关心最后的位置,而这种情况下记录的值基本上也是每个值就一次。那么就选最后的值就行了,反正用户不关心。