我试图实现简单的播放器与UISlider指出在什么时候是当前的音频文件。
的数据
在代码中,我添加了两个观察者:
slider.rx.value.subscribe(onNext: { value in
let totalTime = Float(CMTimeGetSeconds(self.player.currentItem!.duration))
let seconds = value * totalTime
let time = CMTime(seconds: Double(seconds), preferredTimescale: CMTimeScale(NSEC_PER_SEC))
self.player.seek(to: time)
}).disposed(by: bag)
let interval = CMTime(seconds: 0.1, preferredTimescale: CMTimeScale(NSEC_PER_SEC))
player.addPeriodicTimeObserver(forInterval: interval, queue: nil) { [weak self] time in
self?.updateSlider(with: time)
}
字符串
只有一个私人功能:
private func updateSlider(with time: CMTime) {
let currentTime = CMTimeGetSeconds(time)
var totalTime = CMTimeGetSeconds(player.currentItem!.duration)
if totalTime.isNaN {
totalTime = 0
}
startLabel.text = Int(currentTime).descriptiveDuration
endLabel.text = Int(totalTime).descriptiveDuration
slider.value = Float(currentTime / totalTime)
}
型
当音频播放时,一切都很好,滑块也更新了很多。当我在音频播放时尝试手动移动滑块时,问题就出现了,然后它就跳了。为什么?
更新
我知道为什么。因为我更新了两次:手动和玩家观察,但如何防止这种行为?
1条答案
按热度按时间x759pob21#
一个简单的方法是阻止
addPeriodicTimeObserver
在滑动条被触摸时调用self?.updateSlider(with: time)
。这可以通过
UISlider
sisTracking
属性来确定:isTracking
一个布尔值,指示控件当前是否正在跟踪触摸事件。
当正在跟踪触摸事件时,控件将此属性的值设置为true。当跟踪结束或由于任何原因被取消时,它将此属性设置为false。
参考:https://developer.apple.com/documentation/uikit/uicontrol/1618210-istracking
这存在于所有
UIControl
元素中,您可以以这种方式使用:字符串
通用示例:
型
我相信还有其他(更好的)方法,但我还没有在RxSwift中做太多。
我希望这对现在来说足够了。