SwiftUIでUIImagePickerControllerを使う


SwiftUIでSwiftUIでUIImagePickerControllerを使う方法です。 UIKit と同じように任意の画像を取得することができました。

ImagePicker

Importing an image into SwiftUI using UIImagePickerController

ContentView.swift

import SwiftUI

struct ContentView: View {
    @State private var image: Image = Image("icon")
    @State private var showingImagePicker = false
    @State private var inputImage: UIImage?
    
    var body: some View {
        Button(action: {
            print("Tapped")
            self.showingImagePicker = true
        }) {
            image
                .resizable()
                .renderingMode(.original)
                .frame(width: 100, height: 100)
            
            Text("Tap Me!!")
        }.sheet(isPresented: $showingImagePicker, onDismiss: loadImage) {
            ImagePicker(image: self.$inputImage)
        }
    }
    
    func loadImage() {
        guard let inputImage = inputImage else { return }
        image = Image(uiImage: inputImage)
    }
}

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


struct ImagePicker: UIViewControllerRepresentable {
    @Environment(\.presentationMode) var presentationMode
    @Binding var image: UIImage?
    
    class Coordinator: NSObject, UINavigationControllerDelegate, UIImagePickerControllerDelegate {
        let parent: ImagePicker
        
        init(_ parent: ImagePicker) {
            self.parent = parent
        }
        
        func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) {
            if let uiImage = info[.originalImage] as? UIImage {
                parent.image = uiImage
            }
            
            parent.presentationMode.wrappedValue.dismiss()
        }
    }
    
    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }
    
    func makeUIViewController(context: UIViewControllerRepresentableContext<ImagePicker>) -> UIImagePickerController {
        let picker = UIImagePickerController()
        picker.delegate = context.coordinator
        return picker
    }
    
    func updateUIViewController(_ uiViewController: UIImagePickerController, context: UIViewControllerRepresentableContext<ImagePicker>) {

    }
}