【问题标题】:ios - replacing an image with a video player dynamicallyios - 用视频播放器动态替换图像
【发布时间】:2017-06-26 15:44:57
【问题描述】:

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

  • 剧集的图片
  • 标题
  • 剧集描述和技术信息

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

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

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

【问题讨论】:

  • 您应该创建自己的 AVPlayerLayer,这是一个 CALayer 实例,AVPlayer 可以将其视觉输出定向到该实例。在 Storyboard 中使用您的尺寸创建 UIView,将您的 UIImageView 添加到其中并为两者创建插座。在代码中,使用您的 AVPlayer 初始化 AVPlayerLayer,并将其作为子视图添加到容器视图中。从那里你可以隐藏/播放等。
  • 谢谢,法比扬。会试试这个。

标签: ios swift


【解决方案1】:

在情节提要中的UIImageView 顶部放置一个UIView。将其与UIImageView 的所有 4 个边对齐。然后通过设置isHidden属性根据需要隐藏和显示它们。 然后,通过代码在UIView 中插入AVPlayer。

【讨论】:

    【解决方案2】:

    步骤

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

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

    快速代码示例

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

    结果

    更多选项

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

    【讨论】:

    • 您好,我按照您提到的步骤操作,但图像有问题。我将 UIView 放在情节提要中,并限制了上、右、左和纵横比。然后我以编程方式创建了 UIImageView,将 imageView 框架设置为 containerView 框架,并将其作为子视图添加到容器视图中。问题是UIView的顶部和UIImageView的顶部之间出现了很大的差距。
    猜你喜欢
    • 2020-08-17
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    • 2017-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多