在SwiftUI视图中嵌入视频

8

我的主要目标是使用SwiftUI将GIF/MP4文件嵌入到HStack/VStack的视图中。我了解代码需要符合'Representable'协议。我第一次尝试实现这个目标的代码如下:

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

问题在于我认为"self"在这里没有任何意义,我们需要引用一个视图。我们该怎么做呢?我们不能只是在故事板中创建一个视图,因为我想将视图控制器与SwiftUI集成。
如果有帮助,将不胜感激。
P.S. 这是我的第一个iOS应用程序,所以如果我在这里漏掉了什么非常明显的东西,请尽量友善!

我不使用AVKit(?),但看起来你在正确的轨道上。是的,你需要创建一个UIViewControllerRepresentable。而且别忘了,在SwiftUI中,它只是一个View。我已经为UIImagePickerControllerUIActivityViewControllerMTKView完成了这个操作(是的,我需要将其包装到一个UIViewController中以获得委托方法)。你正在做确切的事情,正如我需要处理活动视图控制器——将其包装在执行present的VC中。有些蹩脚?肯定是的。但请记住,我们仅仅处于版本1的第3个beta版。 - user7014451
在阅读您的P.S后的最终想法是什么?为什么选择 SwiftUI?当然,这是“未来发展的方向”。但不要认为 UIKit 不久将被弃用。(也许十年后。说真的。)有很多例子可以在 UIKit 应用程序中实现你想要的功能。另外,请不要忽视所有 SwiftUI 应用程序都需要在今年秋天推出的操作系统版本。由于这是您的第一个iOS应用程序,您可能希望从“前沿”中撤退。 - user7014451
可能是如何在SwiftUI的VStack中显示AVPlayer的重复问题。 - Bogdan Farca
@dfd 抱歉,我还有点困惑,不知道该如何执行。 - Vedant
关于我的第一条评论,我正在开发一个SwiftUI应用程序,(目前)需要将三个UIKit类作为UIViewControllerRepresentable移入其中,因为beta版本的原因。其中一个是UIActivityViewController,(1)在SwiftUI中尚不存在,(2)通常在UIKit中通过“分享”按钮点击使用present,就像您的AVPlayerViewController一样。出于特定原因(iPad需要一个sourceView),我创建了一个“包装VC”,它呈现并且是那个sourceView。https://dev59.com/C1MI5IYBdhLWcg3wM4h0#56828100 - user7014451
显示剩余7条评论
1个回答

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

我得到了“AVPlayerView”类型不符合协议“UIViewControllerRepresentable”的错误。 - Ahmadreza
这几乎可以工作了。当视频出现时,视图会播放视频,但没有图像,只有声音。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接