Мне нужно иметь возможность открыть камеру в SwiftUI и сделать фотографию в приложении - PullRequest
0 голосов
/ 05 октября 2019

Я работаю над приложением в SwiftUI, где мне нужен доступ к камере на iPhone, чтобы сделать снимок в приложении. Я следовал учебному пособию (https://www.youtube.com/watch?v=W60nnRFUGaI) о том, как получить доступ к фотографиям на устройстве из imagePicker, но нигде не могу найти способ доступа к фактическому виду камеры, чтобы сделать фотографию или видео.

Воткод, который я пробовал

import SwiftUI

struct ContentView: View {

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

    var body: some View {
        VStack {

            image?.resizable()
                .scaledToFit()

            Button("Open Photo Library") {
                self.showImagePicker = true
            }.padding()
                .background(Color.blue)
                .foregroundColor(Color.white)
                .cornerRadius(10)
        }.sheet(isPresented: self.$showImagePicker) {
            PhotoCaptureView(showImagePicker: self.$showImagePicker, image: self.$image)
        }
    }
} 
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
    }

}
import SwiftUI

struct PhotoCaptureView: View {

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


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

#if DEBUG
struct PhotoCaptureView_Previews: PreviewProvider {
    static var previews: some View {
        PhotoCaptureView(showImagePicker: .constant(false), image: .constant(Image("")))
    }
}
#endif

Ответы [ 2 ]

0 голосов
/ 11 ноября 2019

Измените это:

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

На это:

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
}

Помните, что вы сможете открыть камеру только в реальном физическом устройстве. Симулятор не поддерживает только просмотр изображений с камеры. Надеюсь, что это работает!

0 голосов
/ 12 октября 2019

Я в основном тот же код, только с некоторыми изменениями:

struct CameraView: UIViewControllerRepresentable {

@Binding var showCameraView: Bool
@Binding var pickedImage: 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.pickedImage = Image(uiImage: uiImage)
        parent.showCameraView = false
    }

    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        parent.showCameraView = false
    }
}

}

Затем вы можете использовать это, как вы сделали с вашим кодом (:

...