ios - 动态替换视频播放器中的图像

时间:2017-06-24 17:43:22

标签: ios swift

我的应用程序(Swift 3,带有UIStoryboard)显示了节目中的剧集列表。每当用户点击表格中的一集时,他/她就会得到一个详细视图(从上到下):

  • 剧集的形象
  • 标题
  • 对剧集和技术信息的描述

根据用户类型,我们希望有一个视频播放器,而不是显示剧集的图像,以便订阅的人可以开始观看视频(未订阅的用户只会看到图像)。< / p>

根据我们用户的订阅状态,视频播放器应播放内容(已订阅)或显示图片(已取消订阅)。

有没有办法动态删除图像并将其替换为完全相同的点和尺寸的视频播放器?如果是这样,当前应用于图像的自动布局约束会发生什么?

2 个答案:

答案 0 :(得分:2)

在故事板中的UIView顶部放置UIImageView。将其与UIImageView的所有4条边对齐。然后通过设置isHidden属性隐藏并根据需要显示它们。 然后,在AVPlayer代码中插入UIView

答案 1 :(得分:0)

步骤

以下解决方案适用于代码中的UIStoryboard和UI。

  1. 在InterfaceBuilder中,将UIView首选大小拖到画布上,添加自动布局约束并创建一个插座(称为&#34; containerView&#34;)
  2. 使用URL或文件配置AVPlayer,使用播放器初始化AVPlayerLayer实例并将图层添加到containerView's图层层次结构
  3. 在容器视图顶部添加UIImageView
  4. 根据您的情况,显示/隐藏/停止/播放您的电影和图像
  5. 快速代码示例

    import UIKit
    import AVFoundation
    
    class ViewController: UIViewController {
    
    
        // MARK: - Properties
    
        @IBOutlet var containerView: UIView!
        private var imageView: UIImageView!
        private var isUserSubscribed = true
    
    
        // MARK: - Lifecycle
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            // Video
            let url = URL(string: "https://content.jwplatform.com/manifests/vM7nH0Kl.m3u8")!
            let avPlayer = AVPlayer(playerItem: AVPlayerItem(url: url))
            let avPlayerLayer = AVPlayerLayer(player: avPlayer)
            avPlayerLayer.frame = containerView.bounds
            containerView.layer.insertSublayer(avPlayerLayer, at: 0)
    
            // Image
            imageView = UIImageView(image: UIImage(named: "someImage"))
            imageView.frame = containerView.frame
            containerView.addSubview(imageView)
    
            // Condition
            if isUserSubscribed {
                imageView.isHidden = true
                avPlayer.play()
            } else {
                imageView.isHidden = false
            }
        }
    }
    

    结果

    Screenshot

    更多选项

    使用这种方法,您需要添加自己的播放控件,这基本上归结为添加带操作的按钮,触发AVPlayer.play()AVPlayer.stop()等。