8

Wdrażam odtwarzacz wideo z systemem iOS, używając AVPlayerViewController z niestandardowymi kontrolkami odtwarzania (tj. Właściwość showsPlaybackControls jest zdefiniowana jako NO). Wydaje się, że w większości przypadków działa poprawnie. Jedyny problem, jaki widzę, to to, że chciałbym użyć niestandardowego wskaźnika aktywności z odtwarzaczem, ale wygląda na to, że AVPlayerViewController pokazuje domyślny wskaźnik aktywności podczas buforowania wideo w niektórych punktach .Usuń wskaźnik aktywności buforowania z AVPlayerViewController

Czy istnieje sposób usunięcia tego domyślnego widoku wskaźnika aktywności z AVPlayerViewController?

Obraz pokazuje, co opisuję, elementy sterujące na dole są niestandardowe i nałożone na odtwarzacz, ale wskaźnik aktywności nie jest.

player with custom controls and default activity indicator

+4

Mam nadzieję, że ktoś może pomóc, próbuję zrobić to samo! – Pangu

Odpowiedz

2

Zrobiłem rozszerzenie AVPlayerViewController, które ujawnia wskaźnik aktywności wewnętrznej. Proszę bardzo, ze wszystkimi Swift 3 seksapil:

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 
     } 
    } 
} 

Z tym, można też łatwo Style UIActivityIndicatorView lub po prostu ukryć to wszystko razem, np:

playerViewController.isActivityIndicatorHidden = true 
+0

Wystąpił błąd: "Wyrażenie było zbyt złożone, aby można je było rozwiązać w rozsądnym czasie, należy rozważyć podzielenie wyrażenia na różne wyrażenia podrzędne" – Rinku

+0

Bardzo łatwe do rozwiązania, wystarczy podzielić je na kilka wyrażeń. Więc nie rób każdej "płaskiej mapy" na tej samej linii, twórz przerywane zmienne. –

1

ja też szukał tego rozwiązania i sposób udało mi się zrobić to hide odtwarzacz wideo Widok kontrolery raz zacząłem grać wideo i kiedy film jest gotowy do gry pokażę go ponownie.

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 
    } 
}