8

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

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

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

player with custom controls and default activity indicator

+4

Я надеюсь, что кто-то может помочь, я Я пытаюсь сделать то же самое! – Pangu

ответ

2

Я сделал расширение AVPlayerViewController, которое отображает индикатор внутренней активности. Здесь вы идете, со всеми Swift 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 
+0

получение ошибки: «Выражение было слишком сложным, чтобы быть разрешенным в разумные сроки, рассмотрите разбиение выражения на отдельные подвыражения» – Rinku

+0

Очень легко решить, просто разбить его на несколько выражений. Поэтому не делайте никаких «flatMap» в одной строке, создавайте прерывистые переменные. –

1

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

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 
    } 
} 
Смежные вопросы