SwiftUI

【SwiftUI】PhotoLibraryとCameraを使う

以下のサイトを参考に作成しました。

https://qiita.com/chino_tweet/items/747dac84c6f30fd1fb1c

https://www.hackingwithswift.com/books/ios-swiftui/importing-an-image-into-swiftui-using-uiimagepickercontroller

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等で表示している際に変数を渡さずに閉じることができるので便利です。
参考記事

-SwiftUI
-, , ,

© 2024 swift技術ブログ Powered by AFFINGER5