Swift 4 带AVPlayer的UISlider不滑动
Swift 4 The UISlider with AVPlayer doesn't slide
我正在尝试使用 UISlider
控制音频,print()
语句打印出正确的值并且应用程序没有崩溃,但是当我尝试抓住它并移动滑块时(拇指色调),UISlider
不会滑动,但当我尝试滑动它时会移动一点(就像点击一样)。
当我评论第 6 行时,滑块响应正确(但当然没有任何反应)。
var playerItem : AVPlayerItem?
var player : AVPlayer?
@IBAction func adjustSongProgress(_ sender: UISlider) {
player?.pause()
let floatTime = Float(CMTimeGetSeconds(player!.currentTime()))
sliderProgressOutlet.value = floatTime
print(floatTime)
player?.play()
}
iOS 滑块取值在 0 到 1 之间。如果 CMTimeGetSeconds return 值在 0 到 1 之外,它将无法正确设置。
因此您必须将时间范围转换为滑块范围。
例如:你的 video/audio 长度是 120 秒,你想将滑块移动到 30 second.than 你可以使用下面的函数计算新值。
OldRange = (OldMax - OldMin)
NewRange = NewMax - NewMin
NewValue = (((OldValue - OldMin) * NewRange) / OldRange) + NewMin
oldRange = 120 - 0
newRange = 1 - 0
New value = (30-0)*1/120+0 = 0.25
通过删除 AVPlayer
并将 AVPlayerItem
更改为 AVAudioPlayer
,然后将歌曲 URL 放入数据来修复它:`
//DOWNLOADS THE SONG IN THE URL AND PUTS IT IN DATA
var task: URLSessionTask? = nil
if let songUrl = songUrl {
task = URLSession.shared.dataTask(with: songUrl, completionHandler: { data, response, error in
// SELF.PLAYER IS STRONG PROPERTY
if let data = data {
self.playerItem = try? AVAudioPlayer(data: data)
self.playPause()
DispatchQueue.main.async {
self.sliderProgress()
}
}
})
task?.resume()`
然后我将UISlider
IBAction
Value Changed
更改为Touch Down
和Touch Up Inside
当我将它连接到ViewController
时:
// TOUCH DOWN
@IBAction func SliderTouchDown(_ sender: UISlider) {
playerItem?.pause()
}
//TOUCH UP INSIDE
@IBAction func SliderTouchUpInside(_ sender: UISlider) {
playerItem?.currentTime = TimeInterval(sliderProgressOutlet.value)
playerItem?.play()
}
我正在尝试使用 UISlider
控制音频,print()
语句打印出正确的值并且应用程序没有崩溃,但是当我尝试抓住它并移动滑块时(拇指色调),UISlider
不会滑动,但当我尝试滑动它时会移动一点(就像点击一样)。
当我评论第 6 行时,滑块响应正确(但当然没有任何反应)。
var playerItem : AVPlayerItem?
var player : AVPlayer?
@IBAction func adjustSongProgress(_ sender: UISlider) {
player?.pause()
let floatTime = Float(CMTimeGetSeconds(player!.currentTime()))
sliderProgressOutlet.value = floatTime
print(floatTime)
player?.play()
}
iOS 滑块取值在 0 到 1 之间。如果 CMTimeGetSeconds return 值在 0 到 1 之外,它将无法正确设置。
因此您必须将时间范围转换为滑块范围。
例如:你的 video/audio 长度是 120 秒,你想将滑块移动到 30 second.than 你可以使用下面的函数计算新值。
OldRange = (OldMax - OldMin)
NewRange = NewMax - NewMin
NewValue = (((OldValue - OldMin) * NewRange) / OldRange) + NewMin
oldRange = 120 - 0
newRange = 1 - 0
New value = (30-0)*1/120+0 = 0.25
通过删除 AVPlayer
并将 AVPlayerItem
更改为 AVAudioPlayer
,然后将歌曲 URL 放入数据来修复它:`
//DOWNLOADS THE SONG IN THE URL AND PUTS IT IN DATA
var task: URLSessionTask? = nil
if let songUrl = songUrl {
task = URLSession.shared.dataTask(with: songUrl, completionHandler: { data, response, error in
// SELF.PLAYER IS STRONG PROPERTY
if let data = data {
self.playerItem = try? AVAudioPlayer(data: data)
self.playPause()
DispatchQueue.main.async {
self.sliderProgress()
}
}
})
task?.resume()`
然后我将UISlider
IBAction
Value Changed
更改为Touch Down
和Touch Up Inside
当我将它连接到ViewController
时:
// TOUCH DOWN
@IBAction func SliderTouchDown(_ sender: UISlider) {
playerItem?.pause()
}
//TOUCH UP INSIDE
@IBAction func SliderTouchUpInside(_ sender: UISlider) {
playerItem?.currentTime = TimeInterval(sliderProgressOutlet.value)
playerItem?.play()
}