在SwiftUI视图中嵌入视频

时间:2019-07-08 19:09:34

标签: swift uikit swiftui avkit

我的主要目标是在SwiftUI的H / V堆栈中的视图中嵌入GIF / MP4文件。我了解我需要按照“可代表”协议进行操作。我的第一次尝试如下:

import SwiftUI
import AVKit

struct GIF : UIViewControllerRepresentable {

    let url_name: String

    func makeUIViewController(context: UIViewControllerRepresentableContext<GIF>) -> AVPlayerViewController {
        return AVPlayerViewController()
    }

    func updateUIViewController(_ uiViewController: AVPlayerViewController, context: UIViewControllerRepresentableContext<GIF>) {
        let url = URL(string: url_name)!
        let player = AVPlayer(url: url)
        let vc = AVPlayerViewController()
        vc.player = player
//PROBLEM
        self.present(vc, animated: true){
            vc.player?.play()
        }
    }
}

这里的主要问题是我认为“自我”在这里没有任何意义,我们需要引用一个视图。但是,我们将如何做呢?我们不能只在故事板上创建视图,因为我想将视图控制器与SwiftUI集成。

任何帮助将不胜感激。

P.S。这是我的第一个iOS应用程序,因此,如果我在这里遗漏了一些非常明显的内容,请尝试保持友善!

1 个答案:

答案 0 :(得分:0)

包装旧的AVPlayerViewController很容易

import AVKit
import SwiftUI

struct AVPlayerView: UIViewControllerRepresentable {
@Binding var videoURL: URL?

private var player: AVPlayer? {
    guard let url = videoURL else {
        return nil
    }
    return AVPlayer(url: url)
}

func updateUIViewController(_ playerController: AVPlayerViewController, context: Context) {
    playerController.player = player
    playerController.player?.play()
}

func makeUIViewController(context: Context) -> AVPlayerViewController {
    AVPlayerViewController()
}
}

但是如果您的目标等于或高于14,则可以使用swiftui中的VideoPlayer组件而无需任何包装器

import SwiftUI
import AVKit

struct UrView: View {
    var body:  some  View {
         VideoPlayer(
             player: AVPlayer(url: URL(string: "{ur url}"))
         )
    }
}