8

我正在實現一個使用AVPlayerViewController並具有自定義播放控件(即,showsPlaybackControls屬性被定義爲NO)的iOS視頻播放器。這似乎在大多數情況下都能正常工作,我看到的唯一問題是我也想在播放器中使用自定義活動指示器,但似乎AVPlayerViewController顯示了默認活動指示器,同時在某些點緩衝了視頻。從AVPlayerViewController中刪除緩衝活動指示器

有沒有辦法從AVPlayerViewController中刪除這個默認的活動指標視圖?

該圖顯示了我所描述的內容,底部的控件是自定義的,並覆蓋在播放器的頂部,但活動指示器不是。

player with custom controls and default activity indicator

+4

我希望有人能幫助我正在嘗試做同樣的事情! – Pangu

回答

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