Ios Can';t使用SwiftUI加载相机

Ios Can';t使用SwiftUI加载相机,ios,xcode,camera,uiimagepickercontroller,swift5.1,Ios,Xcode,Camera,Uiimagepickercontroller,Swift5.1,我有两个按钮,一个用于从多媒体资料加载图像,另一个用于从相机加载图像(即拍照)。但不管我怎么努力,我总是得到画廊的负载,而不是相机。我在UIImagePickerController中使用了以下代码(来自谷歌搜索): // // ImagePicker.swift // import Foundation import SwiftUI class ImagePickerCoordinator: NSObject, UINavigationControllerDelegate,

我有两个按钮,一个用于从多媒体资料加载图像,另一个用于从相机加载图像(即拍照)。但不管我怎么努力,我总是得到画廊的负载,而不是相机。我在UIImagePickerController中使用了以下代码(来自谷歌搜索):

//
//  ImagePicker.swift
//

import Foundation
import SwiftUI

class ImagePickerCoordinator: NSObject, UINavigationControllerDelegate,             
UIImagePickerControllerDelegate {

@Binding var isShown: Bool
@Binding var image: Image?

init(isShown: Binding<Bool>, image: Binding<Image?>) {
    _isShown = isShown
    _image = image
}

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {

    let uiImage = info[UIImagePickerController.InfoKey.originalImage] as! UIImage
    image = Image(uiImage: uiImage)
    isShown = false

}

func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
    isShown = false
}

}

struct ImagePicker: UIViewControllerRepresentable {

@Binding var isShown: Bool
@Binding var image: Image?

func updateUIViewController(_ uiViewController: UIImagePickerController, context: UIViewControllerRepresentableContext<ImagePicker>) {

}

func makeCoordinator() -> ImagePickerCoordinator {
    return ImagePickerCoordinator(isShown: $isShown, image: $image)
}

func makeUIViewController(context: UIViewControllerRepresentableContext<ImagePicker>) -> UIImagePickerController {
    let picker = UIImagePickerController()
    picker.delegate = context.coordinator
    return picker
}

}

struct CameraPicker: UIViewControllerRepresentable {

@Binding var isShown: Bool
@Binding var image: Image?

func updateUIViewController(_ uiViewController: UIImagePickerController, context: UIViewControllerRepresentableContext<CameraPicker>) {

}

func makeCoordinator() -> ImagePickerCoordinator {
    return ImagePickerCoordinator(isShown: $isShown, image: $image)
}

func makeUIViewController(context: UIViewControllerRepresentableContext<CameraPicker>) -> UIImagePickerController {
    let picker = UIImagePickerController()
    picker.sourceType = .camera
    picker.allowsEditing = true
    picker.delegate = context.coordinator
    return picker
}

}

struct CameraView: UIViewControllerRepresentable {

@Binding var isShown: Bool
@Binding var image: Image?

func makeCoordinator() -> CameraView.Coordinator {
    Coordinator(self)
}

func makeUIViewController(context: UIViewControllerRepresentableContext<CameraView>) -> UIViewController {
    let cameraViewController = UIImagePickerController()
    cameraViewController.delegate = context.coordinator
    cameraViewController.sourceType = .camera
    cameraViewController.allowsEditing = false
    return cameraViewController
}

func updateUIViewController(_ uiViewController: UIViewController, context: UIViewControllerRepresentableContext<CameraView>) {

}

class Coordinator: NSObject, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    var parent: CameraView

    init(_ cameraView: CameraView) {
        self.parent = cameraView
    }

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        let uiImage = info[UIImagePickerController.InfoKey.originalImage] as! UIImage
        parent.image = Image(uiImage: uiImage)
        parent.isShown = false
    }

    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        parent.isShown = false
    }
}
}
要从库中获取图像,请执行以下操作:

//
//  GalleryCapture.swift
//

import SwiftUI

struct GalleryCaptureView: View {

    @Binding var showImagePicker: Bool
    @Binding var image: Image?

    var body: some View {
        ImagePicker(isShown: $showImagePicker, image: $image)
    }
}

#if DEBUG
struct GalleryCaptureView_Previews: PreviewProvider {
    static var previews: some View {
        GalleryCaptureView(showImagePicker: .constant(false), image: .constant(Image("")))
    }
}
#endif
我的内容视图:

//
//  ContentView.swift
//

import SwiftUI

struct ContentView: View {

    @State private var showImagePicker: Bool = false
    @State private var image: Image? = nil

    // Function that converts an UIImage to Image
    func returnImage() -> Image
    {
        guard let img = image else {
            fatalError("Unable to load image")
        }
        return img
//        return Image(uiImage: img)
    }


    // Main Body
    var body: some View {
        NavigationView {
            VStack {
                VStack {
                    image?.resizable()
                        .frame(width: 299, height: 299)
                        .cornerRadius(6)
                }


//                returnImage()
//                    .resizable()
//                    .frame(width: 299, height: 299)
//                    .cornerRadius(6)
//                    .onTapGesture {
//                        self.showImagePicker = true
//                    }


                HStack {

                    Button(action: {self.showImagePicker.toggle()}) {
                        Image(systemName: "photo")
                            .font(.largeTitle)
                            .foregroundColor(.white)
                        Text("Gallery")
                                .foregroundColor(.white)
                            }.padding()
                            .background(Color.blue)
                            .cornerRadius(10)
                   .sheet(isPresented: self.$showImagePicker) {
                        GalleryCaptureView(showImagePicker: self.$showImagePicker, image: self.$image)
                   }

                    Button(action: {self.showImagePicker.toggle()}) {
                        Image(systemName: "camera")
                            .font(.largeTitle)
                            .foregroundColor(.white)
                        Text("Camera")
                        .foregroundColor(.white)
                    }.padding()
                    .background(Color.green)
                    .cornerRadius(10)
                    .sheet(isPresented: self.$showImagePicker) {
                        PhotoCaptureView(showImagePicker: self.$showImagePicker, image: self.$image)
                    }
                }
            }
            .navigationBarTitle("My first app")
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

我想使用MLkit,因此可能需要考虑使用UIImage而不是Image。

在按钮上,您必须使用self.showImagePicker来实现如下设置:

 var body: some View {
        NavigationView{

            VStack {

                image?.resizable().scaledToFit()

                Button("Open Camera"){
                    self.showImagePicker = true
                }.padding()
                .foregroundColor(Color.white)
                .background(Color.purple)
                .cornerRadius(10)
            }.sheet(isPresented: self.$showImagePicker){
                PhotoCaptureView(showImagePicker: self.$showImagePicker, image: self.$image)
            }

            .navigationBarTitle(Text("Camera"))
        }
    }
在makeUIViewController方法中,只需在picker.delegate=context.coordinator的正下方添加以下代码:

func makeUIViewController(context: UIViewControllerRepresentableContext<ImagePicker>) -> UIImagePickerController {
    let picker = UIImagePickerController()
    picker.delegate = context.coordinator
    if !UIImagePickerController.isSourceTypeAvailable(.camera){
        picker.sourceType = .photoLibrary
    } else {
        picker.sourceType = .camera
    }
    return picker
}
func makeUIViewController(上下文:UIViewControllerRepresentableContext)->UIImagePickerController{
让picker=UIImagePickerController()
picker.delegate=context.coordinator
if!UIImagePickerController.isSourceTypeAvailable(.camera){
picker.sourceType=.photoLibrary
}否则{
picker.sourceType=.camera
}
回程选择器
}
注意:摄像机仅在真实设备中打开,而不能在模拟器中打开


将你的代码与这个很棒的代码进行比较,从我的角度来看,它的工作最终变得非常简单。我的错误是使用了与我用于gallery相同的布尔值。

我一定是做错了什么,因为它仍然只是在电话上打开gallery。是的,那是我试图遵循的指南之一是的,我也有。self.showImagePicker.toggle()不也是这样做的吗?
func makeUIViewController(context: UIViewControllerRepresentableContext<ImagePicker>) -> UIImagePickerController {
    let picker = UIImagePickerController()
    picker.delegate = context.coordinator
    if !UIImagePickerController.isSourceTypeAvailable(.camera){
        picker.sourceType = .photoLibrary
    } else {
        picker.sourceType = .camera
    }
    return picker
}