iOSプログラミング with Swift 3


2016.05.27: created by
2017.04.28: revised by

SwiftでCamera使う (ImagePicker経由)

  1. Xcode を起動して "Create a new Xcode project" で "Single View Application" として新しいプロジェクトを開きます。 ここではプロジェクト名を SwiftCamera としています。



  2. Main.storyboard上の ViewController に、右下の "Object library" から "Button" をドラッグして配置します。 さらに、"Button"に表示されているテキストを "Go Camera" とします。



  3. Main.storyboard上の ViewController に、右下の "Object library" から "Image View" をドラッグして配置します。 カメラで撮影した画像を表示したいので、細長に変形します。 さらに ウィンドウ右側の "Show the attribute inspector" から、 Attribute -> View -> Mode を "Aspect Fit" に変更します。



  4. Main.storyboardが表示されている状態で、 ウィンドウの右上の "Show the Assistant Editor" ボタン をクリックして、右側のウィンドウに ViewController.swift が表示されている 状態にします。



  5. Main.storyboard上の Image View を1回クリックして選択してから、 右マウスボタン(またはControllキー+左マウスボタン)でドラッグして、 右側の画面のViewController.swift の
    class ViewController: UIViewController {
    
    の下の行まで持っていきます。 ConnectionはOutlet, Name は myImageView として Connect をクリックしましょう。



  6. ViewConrolle.swift に
    @IBOutlet weak var myImageview: UIImageView!
    
    という行が追加されました。その行の左には丸が表示されていますが、これをクリックすると 何のオブジェクトと結び付いているかわかります。






  7. Main.storyboard上の Button を1回クリックして選択してから、 右マウスボタン(またはControllキー+左マウスボタン)でドラッグして、 右側の画面のViewController.swift の先ほど追加した
    @IBOutlet weak var myImageview: UIImageView!
    
    の下の行まで持っていきます。 ConnectionはAction, Name は goCamera として Connect をクリックしましょう。



  8. ViewController.swift に
    @IBAction func goCamera(sender: AnyObject) {
    }
    
    という2行が追加されます。



  9. ViewController.swift を変更します。
  10. ViewController.swiftに追加するコード(赤字部分)
    import UIKit
    
    class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    
        @IBOutlet weak var myImageView: UIImageView!
    
        @IBAction func goCamera(_ sender: Any) {
            let camera = UIImagePickerControllerSourceType.camera
            if UIImagePickerController.isSourceTypeAvailable(camera) {
                let picker = UIImagePickerController()
                picker.sourceType = camera
                picker.delegate = self
                present(picker, animated: true, completion: nil)
            } else {
                print("camera is unavailable")
            }
        }
        
        func imagePickerController(_ picker:UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
            let image = info[UIImagePickerControllerOriginalImage] as! UIImage
            self.myImageView.image = image
            UIImageWriteToSavedPhotosAlbum(image,nil,nil,nil)
            dismiss(animated: true, completion: nil)
        }
        
        override func viewDidLoad() {
            super.viewDidLoad()
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
        }
    
    }
    
    
  11. カメラにアクセスするためのセキュリティが強化されたため、plist を編集する必要があります。
  12. 画面左上のProject navigator 上で、plist.info を選択します。 Keyの最後の行をクリックして現れる "+ -"マークの "+" マークをドラッグして2つのキーを追加します。 ユーザにカメラ使用の認証を求めるときに表示される Value もそれぞれ設定しておきましょう。

    Key Type Value
    Privacy - Camera Usage Description String Take photos
    Privacy - Photo Library Usage Description String Save photos















  13. 最初に「このアプリでカメラを使う」時と「フォトアルバムにアクセス(保存)する」時に 承認を求められます。



  14. Xcodeを起動中にiOSデバイスを Mac に接続すると、 Xcode のstatusに "Processing symbol files"

    と表示されて、しばらく待つと 左上の実行デバイスに 接続したiOSデバイスの名前が表示されます。 これを選択して実行します。



  15. アプリが起動した状態で画面上の "Go Button" を押すとカメラ撮影の画面に移動します。 撮影した画像を選択するとアプリの画面に戻るが ViewImage には撮影した写真が表示され、 さらにデバイス本体のアルバムにもその写真が保存されています。



  16. サンプルのプロジェクトはこちら。(Xcode 8.3.2版)


http://karel.tsuda.ac.jp