やりたいこと
カメラで写真を撮影して、その写真をアプリ内で使いたい。
環境
- Xcode 13.1
- Swift 5
準備
カメラを使う際は、info.plist の Camera Usage Description を定義しておく必要があります。
処理概要
- カメラのアクセス権限確認
- UIImagePickerController のインスタンス生成、カメラ起動
- Delegateで撮影した写真を受け取る
ソースコード
SampleViewController.swift
class SampleViewController: UIViewController {
/// ボタンタップでカメラを起動する
@IBAction private func startCamera() {
// 1. カメラのアクセス権限確認
self.confirmCameraAuthorizationStatus { isAuthorized in
if isAuthorized {
let sourceType = UIImagePickerController.SourceType.camera
guard UIImagePickerController.isSourceTypeAvailable(sourceType) else {
return
}
// 2. UIImagePickerController のインスタンス生成、カメラ起動
let cameraPicker = UIImagePickerController()
cameraPicker.sourceType = sourceType
cameraPicker.delegate = self
self.present(cameraPicker, animated: true, completion: nil)
}
}
}
/// カメラの利用許可確認
private func confirmCameraAuthorizationStatus(result: @escaping (Bool) -> Void) {
// カメラの利用が許可されているか確認
switch AVCaptureDevice.authorizationStatus(for: .video) {
case .authorized:
result(true)
case .notDetermined:
AVCaptureDevice.requestAccess(for: .video) { isGranted in
DispatchQueue.main.async {
result(isGranted)
}
}
case .denied, .restricted:
result(false)
@unknown default:
result(false)
}
}
}
extension SampleViewController: UIImagePickerControllerDelegate {
// 3. Delegateで撮影した写真を受け取る
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
guard let pickedImage = info[.originalImage] as? UIImage else {
print("写真取得失敗")
picker.dismiss(animated: true, completion: nil)
return
}
picker.dismiss(animated: true, completion: nil)
// pickedImageを使って何か処理をする
}
}
extension SampleViewController: UINavigationControllerDelegate {
}