【问题标题】:Remove buffering activity indicator from AVPlayerViewController从 AVPlayerViewController 中删除缓冲活动指示器
【发布时间】:2016-03-31 18:56:24
【问题描述】:

我正在使用AVPlayerViewController 和自定义播放控件(即showsPlaybackControls 属性定义为NO)来实现一个iOS 视频播放器。这似乎在大多数情况下都能正常工作,我看到的唯一问题是我也想在播放器上使用自定义活动指示器,但似乎AVPlayerViewController 在缓冲视频时显示了默认活动指示器一些点。

有没有办法从AVPlayerViewController 中删除此默认活动指示器视图?

图片显示了我所描述的内容,底部的控件是自定义的并覆盖在播放器的顶部,但活动指示器不是。

【问题讨论】:

  • 我希望有人能提供帮助,我正在尝试做同样的事情!

标签: ios iphone avplayer uiactivityindicatorview avplayerviewcontroller


【解决方案1】:

我对@9​​87654321@ 进行了扩展,以公开内部活动指示器。给你,带着所有 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

【讨论】:

  • 出现错误:“表达式太复杂,无法在合理时间内解决;考虑将表达式分解为不同的子表达式”
  • 很容易解决,只需将其分解成几个表达式即可。所以不要把每个flatMap都放在同一行,创建间歇性变量。
【解决方案2】:

我还搜索了这个解决方案,我设法做到这一点的方法是在我开始播放视频后隐藏视频播放器视图控制器视图,当视频准备好播放时我再次显示它。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-06
    • 2018-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-20
    • 1970-01-01
    相关资源
    最近更新 更多