【问题标题】:Embedding videos in a SwiftUI view在 SwiftUI 视图中嵌入视频
【发布时间】:2019-11-18 08:07:47
【问题描述】:

我的主要目标是使用 SwiftUI 将 GIF/MP4 文件嵌入到 HStack/VStack 的视图中。我了解代码需要符合“可表示”协议。我的第一次尝试如下:

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 集成。

任何帮助将不胜感激。

附:这是我的第一个 iOS 应用,所以如果我在这里遗漏了一些非常明显的东西,请尽量善待!

【问题讨论】:

  • 我不使用AVKit(?) 但看起来你走在正确的轨道上。是的,您需要创建一个UIViewControllerRepresentable。不要忘记,对于SwiftUI,它只是一个View。我已经为 UIImagePickerController、UIActivityViewController 和 MTKView 完成了此操作(是的,我需要将其包装到 UIViewController 中以用于委托方法。您正在做完全我需要做的事情使用活动视图控制器 - 将其包装在执行 present 的 VC 中。Kludgy?当然。但请记住,我们刚刚进入版本 1 的 beta 3。
  • 阅读您的 P.S. 后的最终想法。为什么选择SwiftUI?当然,这是“冰球的去向”。但不要认为UIKit 很快就会被弃用。 (也许在十年内。说真的。)在UIKit 应用程序中有大量示例可以满足您的需求。此外,不要忽略所有SwiftUI 应用程序都需要在今年秋季推出的操作系统版本。由于这是您的第一个 iOS 应用程序,您可能想退出“前沿”。
  • 我同意@dfd。为了不失去对 Swift 开发的兴趣,你可以试试 UIKit,那里有大量的工作示例 :)
  • 感谢大家的支持。至于我为什么选择 SwiftUI - 我只是认为它会比 UIKit 更容易使用,但我现在意识到,在 SwiftUI 得到更多开发和更多社区支持之前,也许它值得坚持使用 UIKit。

标签: swift uikit swiftui avkit


【解决方案1】:

很容易包装旧的 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'
猜你喜欢
  • 2020-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多