以下のサイトを参考に作成しました。
https://qiita.com/chino_tweet/items/747dac84c6f30fd1fb1c
UIImagePickerController
現時点ではSwiftUIにカメラとアルバムにアクセスできるコンポーネントが提供されていないので、
UIViewControllerRepresentableを使って実装します。
import SwiftUI
import UIKit
struct ImagePicker: UIViewControllerRepresentable {
@Binding var selectedImage: UIImage?
@Environment(\.presentationMode) private var presentationMode
var sourceType: UIImagePickerController.SourceType = .camera
func makeUIViewController(context: UIViewControllerRepresentableContext<ImagePicker>) -> UIImagePickerController {
let imagePicker = UIImagePickerController()
imagePicker.allowsEditing = false
imagePicker.sourceType = sourceType
imagePicker.delegate = context.coordinator
return imagePicker
}
func updateUIViewController(_ uiViewController: UIImagePickerController, context: UIViewControllerRepresentableContext<ImagePicker>) {
}
func makeCoordinator() -> Coordinator {
Coordinator(self)
}
final class Coordinator: NSObject, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
var parent: ImagePicker
init(_ parent: ImagePicker) {
self.parent = parent
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
parent.selectedImage = image
}
parent.presentationMode.wrappedValue.dismiss()
}
}
}
呼び出し側は以下のように...
//sourceTypeは.cameraならカメラ,.photoLibraryならカメラロールが開きます
.sheet(isPresented: $isShowImagePicker){
ImagePicker(selectedImage: $image, sourceType: sourceType)
}
今回の記事とはあまり関係ありませんが、
parent.presentationMode.wrappedValue.dismiss()の部分はsheet等で表示している際に変数を渡さずに閉じることができるので便利です。
参考記事