我的主要目标是使用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
。我已经为UIImagePickerController
、UIActivityViewController
和MTKView
完成了这个操作(是的,我需要将其包装到一个UIViewController
中以获得委托方法)。你正在做确切的事情,正如我需要处理活动视图控制器——将其包装在执行present
的VC中。有些蹩脚?肯定是的。但请记住,我们仅仅处于版本1的第3个beta版。 - user7014451SwiftUI
?当然,这是“未来发展的方向”。但不要认为UIKit
不久将被弃用。(也许十年后。说真的。)有很多例子可以在UIKit
应用程序中实现你想要的功能。另外,请不要忽视所有SwiftUI
应用程序都需要在今年秋天推出的操作系统版本。由于这是您的第一个iOS应用程序,您可能希望从“前沿”中撤退。 - user7014451SwiftUI
应用程序,(目前)需要将三个UIKit
类作为UIViewControllerRepresentable
移入其中,因为beta版本的原因。其中一个是UIActivityViewController
,(1)在SwiftUI中尚不存在,(2)通常在UIKit中通过“分享”按钮点击使用present
,就像您的AVPlayerViewController
一样。出于特定原因(iPad需要一个sourceView
),我创建了一个“包装VC”,它呈现并且是那个sourceView
。https://dev59.com/C1MI5IYBdhLWcg3wM4h0#56828100 - user7014451