在我苦苦寻找使用 AVCapture 实现保存图像的相机功能的方法时,我找到了一个使用 UIKit 的很棒的 YouTube 教程。由于我想在完全基于 SwiftUI 构建的应用中实现此功能,因此我只需在包含 UIKit 教程中的代码的 ViewController 中创建 HostedViewController 结构即可。这种托管在单独情况下运行良好(现在仍然运行良好),但我的应用要求将捕获的图像传递给 SwiftUI 视图(仅默认的 ContentView 文件)。我该怎么做?我最初的想法是将图像作为绑定从 SwiftUI 视图传递给 ViewController,但我很难实现这一点。
这是我的 ContentView 文件:
import AVFoundation
import UIKit
struct ContentView: View {
var body: some View {
ZStack {
Color.purple
HostedViewController()
.ignoresSafeArea()
}
}
}
#Preview {
ContentView()
}
以下是我的 ViewController 文件的相关部分:
class ViewController: UIViewController {
// capture session
var session: AVCaptureSession?
// photo output
let output = AVCapturePhotoOutput()
// video preview
let previewLayer = AVCaptureVideoPreviewLayer()
//The rest is a bunch of AVCapture stuff that isn't relevant to my question
@objc private func didTapTakePhoto() {
output.capturePhoto(with: AVCapturePhotoSettings(), delegate: self)
}
}
extension ViewController: AVCapturePhotoCaptureDelegate {
func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
guard let data = photo.fileDataRepresentation() else {
return
}
//saves the image, this is the data I want to pass to the ContentView
let image = UIImage(data: data)
//displays the image
session?.stopRunning()
let imageView = UIImageView(image: image)
imageView.contentMode = .scaleAspectFill
imageView.frame = view.bounds
view.addSubview(imageView)
}
}
struct HostedViewController: UIViewControllerRepresentable {
func makeUIViewController(context: Context) -> UIViewController {
return ViewController()
}
func updateUIViewController(_ uiViewController: UIViewController, context: Context) {
}
typealias UIViewControllerType = UIViewController
}
我需要对此进行哪些具体的更改以便能够从 ContentView 文件中的 ViewController 文件访问图像常量?
提前致谢。
从我的角度来看,您可以尝试这种方法:
Binding
在 ViewController 和 ContentView 之间创建一个属性:最后就是
selectedImage
在 内进行设置photoOutput(_ didFinishProcessingPhoto:error:)
,这样图像就会自动同步ContentView
到 触发if let selectedImage
。另一种方法是创建
Coordinator
然后HostedViewController
重新分配AVCapturePhotoCaptureDelegate
给它的协调器,例如: