簡體   English   中英

從AVPlayerViewController中刪除緩沖活動指示器

[英]Remove buffering activity indicator from AVPlayerViewController

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

有沒有辦法從AVPlayerViewController刪除此默認活動指示器視圖?

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

具有自定義控件和默認活動指示器的玩家

我做了一個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

我也搜索了這個解決方案,我設法制作它的方式是隱藏視頻播放器視圖控制器視圖一旦我開始播放視頻和視頻准備播放我再次顯示它。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM