UISlider 作为音频搜索栏在更改时跳转到最大值
UISlider as audio seekbar jumping to maximum value when changed
我正在使用 UISlider
作为音频的搜索栏,如果它没有动画,它非常适合调整以更改轨道中的位置。如果它是动画的,它会很好地工作并且沿着条形轨迹完美地及时跟踪,但是如果你尝试在动画处于活动状态时调整它,它会跳到条形图的最大值。我认为这两个过程之间存在冲突,但我正在努力解决问题。
func changeProgressBar() {
let trackLength = Float(AudioService.shared.playerItem?.duration.seconds ?? 0)
Timer.scheduledTimer(withTimeInterval: 0.5, repeats: true){_ in
let currentTime = Float(AudioService.shared.player?.currentTime().seconds ?? 0)
let sliderPosition = currentTime / (trackLength / 100)
self.progressBar.setValue(sliderPosition, animated: true)
print("the current time is", currentTime)
print("the slider position is", sliderPosition)
}
}
@IBAction func progressBarValueChanged(_ sender: UISlider) {
let trackLength = AudioService.shared.playerItem?.duration.seconds ?? 0
let sliderValueFloat = progressBar.value * 100.00
let sliderValueDouble = Double(sliderValueFloat)
let targetTime = (trackLength / 100 * sliderValueDouble)
let targetTimeActual = CMTimeMake(value: Int64(targetTime), timescale: 1)
AudioService.shared.player!.seek(to: targetTimeActual)
}
我有一些按钮可以增加或减少 30 秒以在轨道中向前或向后跳过,即使在动画处于活动状态时它们也能正常工作。
@IBAction func plus30Secs(_ sender: UIButton) {
let currentTime = Float(AudioService.shared.player?.currentTime().seconds ?? 0)
let seekTime = currentTime + 30
let seekTimeActual = CMTimeMake(value: Int64(seekTime), timescale: 1)
AudioService.shared.player!.seek(to: seekTimeActual)
}
@IBAction func minus30Secs(_ sender: UIButton) {
let currentTime = Float(AudioService.shared.player?.currentTime().seconds ?? 0)
let seekTime = currentTime - 30
let seekTimeActual = CMTimeMake(value: Int64(seekTime), timescale: 1)
AudioService.shared.player!.seek(to: seekTimeActual)
}
好的,我已经修复了。
问题是我有 progressBar.maximumValue = 100
意味着我的 progressBar.value * 100.00
给出的值是它应该有的值的 100 倍,因此这个值超出了轨道的末端。我删除了 * 100.00
,现在效果很好。
我正在使用 UISlider
作为音频的搜索栏,如果它没有动画,它非常适合调整以更改轨道中的位置。如果它是动画的,它会很好地工作并且沿着条形轨迹完美地及时跟踪,但是如果你尝试在动画处于活动状态时调整它,它会跳到条形图的最大值。我认为这两个过程之间存在冲突,但我正在努力解决问题。
func changeProgressBar() {
let trackLength = Float(AudioService.shared.playerItem?.duration.seconds ?? 0)
Timer.scheduledTimer(withTimeInterval: 0.5, repeats: true){_ in
let currentTime = Float(AudioService.shared.player?.currentTime().seconds ?? 0)
let sliderPosition = currentTime / (trackLength / 100)
self.progressBar.setValue(sliderPosition, animated: true)
print("the current time is", currentTime)
print("the slider position is", sliderPosition)
}
}
@IBAction func progressBarValueChanged(_ sender: UISlider) {
let trackLength = AudioService.shared.playerItem?.duration.seconds ?? 0
let sliderValueFloat = progressBar.value * 100.00
let sliderValueDouble = Double(sliderValueFloat)
let targetTime = (trackLength / 100 * sliderValueDouble)
let targetTimeActual = CMTimeMake(value: Int64(targetTime), timescale: 1)
AudioService.shared.player!.seek(to: targetTimeActual)
}
我有一些按钮可以增加或减少 30 秒以在轨道中向前或向后跳过,即使在动画处于活动状态时它们也能正常工作。
@IBAction func plus30Secs(_ sender: UIButton) {
let currentTime = Float(AudioService.shared.player?.currentTime().seconds ?? 0)
let seekTime = currentTime + 30
let seekTimeActual = CMTimeMake(value: Int64(seekTime), timescale: 1)
AudioService.shared.player!.seek(to: seekTimeActual)
}
@IBAction func minus30Secs(_ sender: UIButton) {
let currentTime = Float(AudioService.shared.player?.currentTime().seconds ?? 0)
let seekTime = currentTime - 30
let seekTimeActual = CMTimeMake(value: Int64(seekTime), timescale: 1)
AudioService.shared.player!.seek(to: seekTimeActual)
}
好的,我已经修复了。
问题是我有 progressBar.maximumValue = 100
意味着我的 progressBar.value * 100.00
给出的值是它应该有的值的 100 倍,因此这个值超出了轨道的末端。我删除了 * 100.00
,现在效果很好。