SwiftUIでUIImagePickerControllerを使う


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

ImagePicker

Importing an image into SwiftUI using UIImagePickerController

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>) {
}
}