【发布时间】:2019-03-08 08:17:18
【问题描述】:
我尝试使用 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)
}
当音频播放时,一切都很好,滑块也更新了很多。当我在播放音频时尝试手动移动滑块时会出现问题,然后它会跳转。为什么?
更新:
我知道为什么。因为我更新了两次:手动和玩家观察者,但是如何防止这种行为?我不知道;)请帮忙。
【问题讨论】:
-
addPeriodicTimeObserver块中的 case 处理如何在滑块被触摸时立即返回? -
@staticVoidMan 您希望如何实现它?;) 请回答您的想法,我会尝试。
-
@BartłomiejSemańczyk 好吧,基本的想法是防止滑块在被触摸/移动时更新。我会写一个示例:)
标签: ios swift avplayer uislider