Когда слайдер песни удерживается слишком долго, positionSlider.value слишком велика - PullRequest
0 голосов
/ 04 июля 2019

Я немного новичок в Swift. Мой слайдер положения песни работает довольно хорошо. Это гладко. Единственная проблема, которую я обнаружил, заключается в том, что она дает странные результаты, если вы удерживаете ползунок в одном месте слишком долго (намного больше, чем секунда). Если вы сделаете это, вы можете получить очень большое число. Возможно, есть гораздо более простой способ работы со слайдером, чем я делал здесь, но это так близко к работе. Спасибо за помощь !!!

var myMPMusicPlayerController = MPMusicPlayerController.systemMusicPlayer
var notificationCenter = NotificationCenter.default
var sliderInUse: Bool! = false
var positionSliderTimer: Timer!
var songTimer: Timer!
var songDuration: Double!
var positionInSong: Double!

override func viewDidLoad() {
positionSliderTimer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(PlayerViewController.updatePositionOfSlider), userInfo: nil, repeats: true)
}

// ********** updateSongTimeDisplays() **********
@objc func updateSongTimeDisplays(_ songTime: Double) {

    var currentTime: Int

    if (self.myMPMusicPlayerController.nowPlayingItem != nil)
    {
        if self.sliderInUse == true {
            currentTime = Int(songTime)
        } else {
            currentTime = Int(self.myMPMusicPlayerController.currentPlaybackTime)
        }

        let currentMinutes = currentTime/60
        let currentSeconds = currentTime - currentMinutes * 60
        songElapsedTime.text = NSString(format: "%02d:%02d", currentMinutes,currentSeconds) as String

        let remainingTime = Int(songDuration) - currentTime
        let remaningMinutes = remainingTime/60
        let remainingSeconds = remainingTime - remaningMinutes * 60
        songRemainingTime.text = NSString(format: "%02d:%02d", remaningMinutes,remainingSeconds) as String

    } else {
        // Reset the time to zero.
        songElapsedTime.text = NSString(format: "%02d:%02d", 0,0) as String
    }
}

// ********** positionSliderTapped() **********
@IBAction func positionSliderTapped(_ sender: Any) {

    self.sliderInUse = true
    positionInSong = TimeInterval(positionSlider.value)
    updateSongTimeDisplays(positionInSong)
}

// ********** updatePositionOfSlider() **********
@objc func updatePositionOfSlider() {

    if sliderInUse == false {
        positionSlider.value = Float(self.myMPMusicPlayerController.currentPlaybackTime)
    }
}

// ********** positionSliderReleased() **********
@objc func positionSliderReleased() {

    self.sliderInUse = false
    self.myMPMusicPlayerController.currentPlaybackTime = positionInSong
}

Большие цифры ниже случаются, когда я держу палец в одной позиции после скольжения

13 13 13 13 13 13 13 15 16 18 19 20 22 24 26 27 29 30 31 32 32 32 33 33 33 33 33 33 33 33 33 33 95654513522583 33 33 33 33 33 33 33 33 33 33 33 33 95656282321708 33 33 33 33 33 33 33

1 Ответ

0 голосов
/ 05 июля 2019

После дальнейших испытаний и трассировки я разобрался. Когда мой код явно вызывает updateSongTimeDisplays (_ songTime: Double), проблем не возникает, потому что я передаю в positionInSong. Но когда iOS вызывает метод updateSongTimeDisplays (_ songTime: Double), который он делает на интервале, iOS не передает этот параметр. Решение состоит в том, чтобы не передавать параметр. Поскольку positionInSong был объявлен как часть класса, мне не нужно его передавать. Теперь он работает отлично!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...