[iPhone] Camera撮影, UIImagePickerController

iOSで簡単にカメラを扱うにはUIImagePickerControllerがあります。撮影して、保存、アルバムで確認するアプリが作れます。簡単に扱える半面できないこともあり、詳細を設定したい場合はAVCapturePhotoOutput、AVCaptureVideoDataOutputを使います。
 

camera_001
「Start」ボタン
camera_002b
カメラ起動
camera_003b
アプリで表示、保存

 

Swift 3.0
Xcode 8.0

 

sponsored link

UIImagePickerController

 
Cameraを扱う場合ユーザー許可を得ないとcrashします。
 

Cocoa Keys

 
Cocoa Keys

This app has crashed because it attempted to access privacy-sensitive data without a usage description. The app’s Info.plist must contain an NSCameraUsageDescription key with a string value explaining to the user how the app uses this data.

こういうエラーが表示されたら、説明の通りInfo.plistの設定を行いましょう。
加えて、フォトライブラリーも当然使うためNSPhotoLibraryUsageDescriptionも加えておきます。
 
Info.plist

 
NSCameraUsageDescriptionというkeyを設定して、valueにはその理由を説明せよという事らしいですね。これを設定するとこんなDialogが表れます。
 
img_0667
 
これにユーザーに許可をdialogで求めるのは最初だけで、その後は自動的に許可されています。ただし、設定のアプリから詳細設定でこの許可・不許可がいつでも設定できるようです。
 
なんかAndroidのRuntime Permissionのようになってきましたね。
ただし、不許可にした場合dialogが出てこない、機能が使えないだけでエラーになるわけでもない。
 

camera app plan

 
Storyboard にアプリの構想もかねて部品を配置してみます

  1. カメラを起動させる
    • ボタン:UIButton「Start」
    • カメラ起動の action
  2. 取った画像を表示
    • 画像表示:UIImageView
  3. 画像を保存
    • ボタン:UIButton「Save」
    • 画像を保存する action
  4. 保存した画像を確認する
    • ボタン:UIButton「Album」
    • アルバムに移動する action
  5. それぞれのステータスを表示
    • ラベル:UILabel

 
camera_1
 
ボタンを3つ作成して、それぞれに「Start」「Save」「Album」と名前を付け、背景色も付けます
 
UIImageView を配置し、ラベルをその下に入れます。まあ、このへんは好みですので適当で
 

UIImagePickerController

 
まずUIImagePickerController というクラスを使います
このクラスの親クラスは UINavigationController です
 
そのためデリゲートとして
「UINavigationControllerDelegate」「UIImagePickerControllerDelegate」
を設定します
 
IBOutlet と部品との関係は
「Start」-> bCameraStart
「Save」-> bSave
「Album」-> bAlbum
「UILabel」-> label
「UIImageView」-> cameraView
です、これに合わせて、storyboard の部品と紐付けします
 
また、それぞれの action は
cameraStart
savePic
showAlbum
でそれぞれのボタンに紐付けし記述します
 
ViewController.swift

 
カメラでの撮影は

1. カメラを利用する設定
2. カメラが利用可能かチェック
3. UIImagePickerController のインスタンスの作成
4. デリゲートを設定
5. present では
UIViewControllerが管理しているビューにを全画面を覆う画像の表示をします

self.present(cameraPicker, animated: true, completion: nil)
 
イメージピッカーはカメラ以外にも使います

  1. UIImagePickerControllerSourceType.camera
    • カメラ
  2. UIImagePickerControllerSourceType.photoLibrary
    • フォトライブラリ

そのため、UIImagePickerControllerSourceType
にどれを使うか指定します。
カメラを使う所と、アルバムを表示するところはほとんど同じです

尚、Objective-C の場合は こちら です
 
関連: