AudioPlayer UISlider Метка отстает - PullRequest
0 голосов
/ 06 июня 2019

Я создаю простой AVAudioPlayer. У меня проблемы с UISlider, который я добавил для использования в качестве инструмента поиска. Левая метка под ползунком длительности «пропускается» по причине, которую я не могу понять. Он зазубрен и не обновляет текст текущей продолжительности. Это связано с тем, что в данный момент находится на слайдере / воспроизводит аудио. Как я могу это исправить? Вот экран записи того, что происходит на устройстве: https://imgur.com/a/frpZKV7

func loadRecordingUI() {
        do {
            audioPlayer = try AVAudioPlayer(contentsOf: getFileUrl())
            audioPlayer.delegate = self
            playbackSlider.maximumValue = CFloat(audioPlayer.duration)
            playbackSlider.minimumValue = CFloat(0.0)
            playbackSlider.value = CFloat(0.0)
            audioPlayer.prepareToPlay()

            let time = calculateTimeFromNSTimeInterval(audioPlayer.duration)
            let totalLengthOfAudio = "\(time.minute):\(time.second)"
            playbackTimeLabelEnd.text = totalLengthOfAudio

            playbackTimeLabelFront.text = "00:00"

        } catch let error as NSError {
            print(error.localizedDescription)
        }

    }}

func startTimer(){
    let timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(ViewController.update(_:)), userInfo: nil,repeats: true)
    timer.fire()
}

func stopTimer(){
    timer.invalidate()
}

@objc func update(_ timer: Timer){
    let time = calculateTimeFromNSTimeInterval(audioPlayer.currentTime)
    DispatchQueue.main.async{

        self.playbackTimeLabelFront.text  = "\(time.minute):\(time.second)"
        self.playbackSlider.value = CFloat(self.audioPlayer.currentTime)
    }
}

@IBAction func slide(_ slider: UISlider) {
    audioPlayer.currentTime = TimeInterval(slider.value)
}

func calculateTimeFromNSTimeInterval(_ duration:TimeInterval) ->(minute:String, second:String){
    let minute_ = abs(Int((duration/60).truncatingRemainder(dividingBy: 60)))
    let second_ = abs(Int(duration.truncatingRemainder(dividingBy: 60)))

    // var hour = hour_ > 9 ? "\(hour_)" : "0\(hour_)"
    let minute = minute_ > 9 ? "\(minute_)" : "0\(minute_)"
    let second = second_ > 9 ? "\(second_)" : "0\(second_)"
    return (minute,second)
}
...