対象:
Swift3

カメラの利用(UIImagePickerController)(Swift)

iOSでカメラ機能を利用する最も簡単な方法は、UIImagePickerControllerを利用する方法だろう。

写真撮影に加えて画像処理等も行いたい場合、UIImagePickerControllerでなく、AVFoundationを使うという手もある。

カメラの利用(AVFoundation)(Swift)

まず、ViewControllerでUIImagePickerControllerDelegateとUINavigationControllerDelegateを継承する。

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

次に、viewDidAppearでUIImagePickerControllerのインスタンスを生成し、presentViewControllerで表示するだけである。

    override func viewDidAppear(_ animated: Bool) {
        let picker = UIImagePickerController()
        picker.sourceType = .camera
        picker.delegate = self
        
        presentViewController(picker, animated: true, completion: nil)
    }

imagePickerControllerメソッドは、シャッターボタンを押下し、"Use Photo"を押下したときに呼ばれるメソッドである。このメソッドで、撮影した写真をカメラロールに保存することができる。

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        print(#function)
        // print(info[UIImagePickerControllerMediaType]!)
        let image = info[UIImagePickerControllerOriginalImage] as! UIImage
        // 撮影した画像をカメラロールに保存
        UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)
    }

コード全体を以下に示す。

import UIKit

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func viewDidAppear(_ animated: Bool) {
        let picker = UIImagePickerController()
        picker.sourceType = .camera
        picker.delegate = self
        
        presentViewController(picker, animated: true, completion: nil)
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        print(#function)
        // print(info[UIImagePickerControllerMediaType]!)
        let image = info[UIImagePickerControllerOriginalImage] as! UIImage
        // 撮影した画像をカメラロールに保存
        UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)
    }
    
    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        print(#function)
    }
}

尚、iOS 10以降でカメラを使用する場合、Info.plistで予めNSCameraUsageDescriptionキーでカメラ初回使用時のメッセージを設定しておく必要がある。さもないと、アプリが以下のようなログとともに起動直後に落ちてしまう。

2016-11-03 14:24:12.486945 SwiftCamera[254:6329] [access] 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キーで写真初回保存時時のメッセージを設定しておく必要がある。こちらも以下のようなログが出力されてアプリが落ちてしまうので気にしておこう。

2016-11-03 14:56:01.884895 SwiftCamera[333:54511] [access] This app has crashed because it attempted to access privacy-sensitive data without a usage description.  The app's Info.plist must contain an NSPhotoLibraryUsageDescription key with a string value explaining to the user how the app uses this data.

例えば、Info.plistでこんな感じにキーと値を設定しておく。この値はアプリが初めてカメラ、及びカメラロールにアクセスする際にダイアログとして表示される。Info.plistをProperty List表示している場合は、"Privacy - Camera Usage Description"キー、及び"Privacy - Photo Library Usage Description"キーを追加してStringの値を設定しても同じである。

	NSPhotoLibraryUsageDescription
	I access to the Photo Library
	NSCameraUsageDescription
	I need a camera
(2016/05/09)
(2016/11/03 更新) Swift 3.0対応。

新着情報
【iOS Objective-C, Swift Tips】画像の向きを指定して保存する(Swift)
【iOS Objective-C, Swift Tips】UIImagePickerControllerの表示を日本語にする(Swift)
【iOS Objective-C, Swift Tips】ウィンドウの階層構造を3D表示する(Swift)

Copyright(C) 2004-2016 モバイル開発系(K) All rights reserved.
[Home]