[英]AVPlayer progress with UISlider Swift
I'm trying to use a slider to control Audio and everything works fine, but when I try to make the slider value equal to the player current time it crashes. 我试图使用滑块控制音频,并且一切正常,但是当我尝试使滑块值等于播放器当前时间时,它崩溃了。
However, if I print something inside the updateSlider
function, it appears and works fine. 但是,如果我在
updateSlider
函数内部打印某些内容,它将显示并正常工作。
override func viewDidLoad()
{
songTitle.text = mainSongTitle
background.image = image
mainImageView.image = image
downloadFileFromURL(url: URL(string: previewURL)!)
var time = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(self.updateSlider), userInfo: nil, repeats: true)
}
func downloadFileFromURL(url : URL)
{
var downloadTask = URLSessionDownloadTask()
downloadTask = URLSession.shared.downloadTask(with: url, completionHandler:
{
customURL , response , error in
self.play(url: customURL!)
self.slider.maximumValue = Float(player.duration)
})
downloadTask.resume()
}
func play(url : URL)
{
do
{
player = try AVAudioPlayer(contentsOf: url)
player.prepareToPlay()
player.play()
}
catch
{
print(error)
}
}
@IBAction func PlayPressed(_ sender: Any)
{
if player.isPlaying
{
player.pause()
}
else
{
player.play()
}
}
@IBAction func ChangerTimePlayer(_ sender: Any)
{
player.stop()
player.currentTime = TimeInterval(slider.value)
player.prepareToPlay()
player.play()
}
func updateSlider()
{
slider.value = Float(player.currentTime)
}
Maybe you should do something like: 也许您应该执行以下操作:
func updateSlider(){
slider.value = Float(player.currentTime/player.duration)
}
Your download completion task needs to be called on the main thread to safely use UIKit
(your slider): 您需要在主线程上调用您的下载完成任务,以安全地使用
UIKit
(您的滑块):
DispatchQueue.main.async {
self.play(url: customURL!)
self.slider.maximumValue = Float(player.duration)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.