Ошибка при настройке минимального и максимального значений UISlider - PullRequest
0 голосов
/ 22 мая 2019

Я играю видео из библиотеки пользователя в моем приложении.Я использую этот метод в ViewDidLoad(), чтобы получить видео:

fileprivate let imageManager = PHImageManager()
fileprivate var playerLayer: AVPlayerLayer?
fileprivate var player:AVPlayer?
fileprivate var videoView:UIView?

imageManager.requestPlayerItem(forVideo: videoAsset, options: options, resultHandler: { playerItem, info in
            DispatchQueue.main.sync {
                guard self.playerLayer == nil else { return }

                self.player = AVPlayer(playerItem: playerItem)
                self.playerLayer = AVPlayerLayer(player: self.player)

                self.videoView = UIView(frame: self.view.frame)
                self.videoView?.contentMode = .scaleAspectFit
                self.playerLayer?.videoGravity = AVLayerVideoGravity.resizeAspect
                self.playerLayer?.frame = self.videoView!.layer.bounds
                self.videoView!.layer.addSublayer(self.playerLayer!)
                self.photoScrollView.addSubview(self.videoView!)
                self.addObserversForVideo()
            }
        })

Внутри addObserversForVideo () я установил разных наблюдателей для обновления ползунка, который управляет видео, а также установил его минимальное и максимальное значения:

        guard let currentPlayer = player else {return}
        guard let currentItem = currentPlayer.currentItem else {return}

        NotificationCenter.default.addObserver(self,
                                               selector: #selector(self.playerFinishedPlayingVideo),
                                               name: NSNotification.Name.AVPlayerItemDidPlayToEndTime,
                                               object: nil)

        let interval = CMTime(seconds: 0.5, preferredTimescale: CMTimeScale(NSEC_PER_SEC))
        _ = playerLayer?.player?.addPeriodicTimeObserver(forInterval: interval, queue: DispatchQueue.main, using: { [weak self] (time) in

            self?.videoSlider.maximumValue = Float(currentItem.duration.seconds)
            self?.videoSlider.minimumValue = 0.0
            self?.videoSlider.value = Float(currentItem.currentTime().seconds)
            self?.videoElapsedTimeLabel.text = self?.getStringFromCMTime(time: currentItem.currentTime())

            let remainingTime = currentItem.duration - currentItem.currentTime()
            self?.videoRemainingTimeLabel.text = self?.getStringFromCMTime(time: remainingTime)

        })

Теперь проблема в том, что я иногда получаю эту ошибку, которая приводит к сбою моего приложения:

'NSInternalInconsistencyException', причина: 'Попытка установить ползунокминимальное значение (0,000000) должно быть больше максимального значения (нан.) '

Я не понимаю, почему это происходит, поскольку я проверяю currentItem на ненулевое значение с оператором охраны наначало, а также я устанавливаю минимальное значение после максимального значения.Буду признателен, если кто-нибудь сможет мне помочь.

Ответы [ 2 ]

0 голосов
/ 22 мая 2019

Вам необходимо защититься от двух дополнительных вещей:

  • currentPlayer.currentItem.status == .readyToPlay
  • currentPlayer.currentItem.duration >= CMTime.zero
0 голосов
/ 22 мая 2019

Благодаря @TonyNguyen я смог решить проблему в одной строке:

    guard currentItem.status.rawValue == AVPlayerItem.Status.readyToPlay.rawValue else {return}
...