swiftuiimagepickercontrollerswiftui

How to pick image from gallery in SwiftUI


I tried to make a SwiftUI class that conforms to UIViewRepresentable and implements makeUIView and updateUIView. But not able to complete it.Here is code :

Code:

struct ImagePicker : UIViewRepresentable {

@Binding var image: UIImage

class Coordinator: NSObject, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    @Binding var image: UIImage

    init(image: Binding<UIImage>) {
        $image = image
    }

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


        if let possibleImage = info[.editedImage] as? UIImage {
            image = possibleImage
        } else if let possibleImage = info[.originalImage] as? UIImage {
            image = possibleImage
        } else {

        }
    }
}

func makeCoordinator() -> Coordinator {
    return Coordinator(image: $image)
}

func makeUIView(context: UIViewRepresentableContext<ImagePicker>) -> UIImageView {
    let imageview = UIImageView()
    let picker = UIImagePickerController()
    picker.delegate = context.coordinator
    return imageview
}

func updateUIView(_ uiView: UIImageView,
                  context: UIViewRepresentableContext<ImagePicker>) {
    uiView.image = image
}

}

I tried imagePicker as control but unable to use.


Solution

  • I am using presentationMode here, to check for the view that is it presenting or not?

    By using this you can dismiss() the UIImagePickerController.

    Sample code for SwiftUI preview:

    import SwiftUI
    
    struct ContentView: View {
    
        @State var isShowPicker: Bool = false
        @State var image: Image? = Image("placeholder")
    
        var body: some View {
            NavigationView {
                ZStack {
                    VStack {
                        image?
                            .resizable()
                            .scaledToFit()
                            .frame(height: 320)
                        Button(action: {
                            withAnimation {
                                self.isShowPicker.toggle()
                            }
                        }) {
                            Image(systemName: "photo")
                                .font(.headline)
                            Text("IMPORT").font(.headline)
                        }.foregroundColor(.black)
                        Spacer()
                    }
                }
                .sheet(isPresented: $isShowPicker) {
                    ImagePicker(image: self.$image)
                }
                .navigationBarTitle("Pick Image")
            }
        }
    }
    
    
    struct ImagePicker: UIViewControllerRepresentable {
    
        @Environment(\.presentationMode)
        var presentationMode
    
        @Binding var image: Image?
    
        class Coordinator: NSObject, UINavigationControllerDelegate, UIImagePickerControllerDelegate {
    
            @Binding var presentationMode: PresentationMode
            @Binding var image: Image?
    
            init(presentationMode: Binding<PresentationMode>, image: Binding<Image?>) {
                _presentationMode = presentationMode
                _image = image
            }
    
            func imagePickerController(_ picker: UIImagePickerController,
                                       didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
                let uiImage = info[UIImagePickerController.InfoKey.originalImage] as! UIImage
                image = Image(uiImage: uiImage)
                presentationMode.dismiss()
    
            }
    
            func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
                presentationMode.dismiss()
            }
    
        }
    
        func makeCoordinator() -> Coordinator {
            return Coordinator(presentationMode: presentationMode, image: $image)
        }
    
        func makeUIViewController(context: UIViewControllerRepresentableContext<ImagePicker>) -> UIImagePickerController {
            let picker = UIImagePickerController()
            picker.delegate = context.coordinator
            return picker
        }
    
        func updateUIViewController(_ uiViewController: UIImagePickerController,
                                    context: UIViewControllerRepresentableContext<ImagePicker>) {
    
        }
    
    }
    
    
    struct ContentView_Previews: PreviewProvider {
        static var previews: some View {
            NavigationView {
                ContentView()
            }
        }
    }