Удалить индикатор активности буферизации из AVPlayerViewController


Я реализую видеоплеер iOS, используя AVPlayerViewController с пользовательскими элементами управления воспроизведением (т. е. свойство showsPlaybackControls определено как NO). Это, кажется, работает правильно в большинстве случаев, единственная проблема, которую я вижу, заключается в том, что я хотел бы использовать пользовательский индикатор активности с плеером, но кажется, что AVPlayerViewController показывает индикатор активности по умолчанию при буферизации видео в некоторых точках.

Есть ли способ удалить это представление индикатора активности по умолчанию из AVPlayerViewController?

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

плеер с пользовательскими элементами управления и индикатором активности по умолчанию

2 9

2 ответа:

Я сделал расширение AVPlayerViewController, которое показывает индикатор внутренней активности. Вот так, со всей стремительностью 3 сексуальности:

import AVKit

extension AVPlayerViewController {
    /// Activity indicator contained nested inside the controller's view.
    var activityIndicator: UIActivityIndicatorView? {
        // Indicator is extracted by traversing the subviews of the controller's `view` property.
        // `AVPlayerViewController`'s view contains a private `AVLoadingIndicatorView` that
        // holds an instance of `UIActivityIndicatorView` as a subview.
        let nestedSubviews: [UIView] = view.subviews
            .flatMap { [$0] + $0.subviews }
            .flatMap { [$0] + $0.subviews }
            .flatMap { [$0] + $0.subviews }
        return nestedSubviews.filter { $0 is UIActivityIndicatorView }.first as? UIActivityIndicatorView
    }

    /// Indicating whether the built-in activity indicator is hidden or not.
    var isActivityIndicatorHidden: Bool {
        set {
            activityIndicator?.alpha = newValue ? 0 : 1
        }
        get {
            return activityIndicator?.alpha == 0
        }
    }
}

С помощью этого вы можете либо легко стилизовать UIActivityIndicatorView, либо просто скрыть все вместе, например:

playerViewController.isActivityIndicatorHidden = true

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

private func playVideo() {

    videoPlayer?.play()

    self.addLoader()

    videoPlayerController.view.hidden = true

    videoPlayer?.addObserver(self, forKeyPath: "status", options: NSKeyValueObservingOptions.New, context: nil)
}

public override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {

    if (object?.isEqual(videoPlayer) == true && keyPath == "status") {

        self.removeLoader()
        videoPlayerController.view.hidden = false
    }
}