【问题标题】:Error when setting UISlider's Min and Max values设置 UISlider 的最小值和最大值时出错
【发布时间】:2019-10-09 06:11:51
【问题描述】:

我正在我的应用中播放用户库中的视频。我在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',原因:'试图设置一个 滑块的 minimumValue (0.000000) 大于 maximumValue (南)'

我不明白为什么会发生这种情况,因为我正在检查 currentItem 是否为非零并在开头使用保护语句,并且我在最大值之后设置最小值。如果有人可以帮助我,我将不胜感激。

【问题讨论】:

标签: ios swift uislider


【解决方案1】:

感谢@TonyNguyen,我可以在一行中解决问题:

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

【讨论】:

    【解决方案2】:

    你需要注意另外两件事:

    • currentPlayer.currentItem.status == .readyToPlay
    • currentPlayer.currentItem.duration >= CMTime.zero

    【讨论】:

      【解决方案3】:

      在我的periodicTimeObserver 中,我将(time) 更改为秒,然后在更新之前检查值是NaN 还是Infinite

      _ = player?.addPeriodicTimeObserver(forInterval: interval, queue: DispatchQueue.main, using: { [weak self] (time) in
      
          let seconds = CMTimeGetSeconds(time)
                  
          guard !(seconds.isNaN || seconds.isInfinite) else {
              return
          }
      
          // the rest of your code
      })
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-19
        • 1970-01-01
        • 2019-07-09
        • 2019-02-10
        • 1970-01-01
        相关资源
        最近更新 更多