[SwiftUI] UIImagePickerController を SwiftUI から使う方法

SwiftUI

iPhone/iPad で写真を扱おうとすると AVFoundation か UIImagePickerController を使う必要がありますが、UIImagePickerController を使うのが簡単です。

UIImagePickerController と SwiftUI を組み合わせて使う方法を説明します。

Info.plist

最近の iOS アプリのお約束ですが、ユーザーデータ等にアクセスするためには、Info.plist にその理由を記載する必要があります。

カメラアプリを作るならば、以下のキー値とその理由を、Info.plist に追加しておく必要があります。

NSCameraUsageDescription
カメラを使う理由を記載

写真アルバムにアクセスするならば、NSPhotoLibraryAddUsageDescription も追加する必要があります。

UIViewControllerRepresentable

SwiftUI の中に組み込むときのお約束の UIViewControllerRepresentable を使って、UIImagePickerController を wrap します。

ユーザーが、写真を撮ったり、選択したときに、呼び出し元に、UIImage を返すようにしています。showCameraView は、カメラ/写真ビューの表示制御フラグです。

内部クラス Controller を作って、Delegate に設定しています。

コード

UIImagePickerControllerDelegate

ユーザーの操作に対して呼び出されるDelegateが、UIImagePickerControllerDelegate です。

以下の関数がポイントになります。

func imagePickerController(UIImagePickerController, didFinishPickingMediaWithInfo: [UIImagePickerController.InfoKey : Any])
ユーザーが撮影した写真に対して”これを使う”を選択したり、写真アプリから写真を選択すると呼び出されます。
func imagePickerControllerDidCancel(UIImagePickerController)
ユーザーが、キャンセルを選択すると呼び出されます。

例えば、ユーザーが写真を撮影したり、選択したときに、UIImage として保存するコードは以下のようになります。

コード

サンプルアプリ

仕様

画面のカメラボタンを押すと、カメラでの撮影ビューを開きます。

写真が撮影されたら、元の画面のカメラボタンの位置に、撮影された写真を表示します。

起動直後 (スナップショットは、iPad の Landscape ですが、特に意味はありません)

justafterlaunch

カメラボタン押下後

afterCameraButtonPushed

ここで、キャンセルが押されると Delegate の該当コールバック(DidCancel)が呼ばれます。撮影ボタンを押しても、Delegate は、何も呼び出されません。(UIImagePickerController の内部遷移が起こっています)

撮影ボタン押下後

afterCaptureButtonPushed

ここで、”Use Photo”ボタンが押されると、Delegate の該当コールバックが呼ばれます(didFinishPickngMediaWithInfo)。”Retake”ボタンは、再度撮影画面に戻りますが、Delegate は、何も呼び出されません。(UIImagePickerController の内部遷移が起こっています)

”Use Photo”ボタン押下後

appScreenAfterDone

選択された写真が、中央に表示されます。

サンプルの実装コードは以下のものです。

SwiftUIImagePicker.swift

ContentView.swift

まとめ: UIImagePickerControllerの使い方

カメラビューを起動して、画像を選択するだけであれば、UIImagePickerController を使うのが非常に簡単です。SwiftUI からでも上記のように非常に簡単に取得することができます。

作ったSwiftUIImagePickerControllerは、こちら

説明は以上です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です