xcode初心者がカメラアプリ作ってみた

今回、xcodeでアプリを作ろうと思っていて、そのためにカメラ機能が必要になったので、ついでに記事化してみました。

#カメラアプリの概要
こんなアプリの予定です。

<img width="375" alt="IMG_4993.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/332034/87216daa-4850-00cd-090d-8ff0f1ff89c4.jpeg">

####カメラを起動させる
ボタンを押して起動。
ボタン：「Button」を使用

####カメラで撮影
撮影した画像を表示
画像表示：「UIImageView」を使用。

####画像を保存
ボタンを押したら、画像保存。
ボタン：「Button」を使用

####保存した画像を確認する
ボタンを押したら、フォトライブラリーにある画像確認
ボタン：「Button」を使用

####現在の状況を表示
常に表示されている
ラベル：「Label」を使用


#Info.plistの編集

info.plistとは、アプリが持っているappleのデバイスにアクセスするのを許可するためのコードです。

今回はこんな感じに4行追加しました。

![スクリーンショット 2019-03-06 23.35.09.png](https://qiita-image-store.s3.amazonaws.com/0/332034/4d09f268-0471-eaa0-c6e3-1918c739e9bd.png)

星をつけたところを追記しました。

#Main.storyboardの編集

-「Button」３つ
- UIImageView」１つ
- Label」１つ

これらのオブジェクトを追加して、こんな感じに並べました。

![スクリーンショット 2019-03-06 23.44.30.png](https://qiita-image-store.s3.amazonaws.com/0/332034/fafd7d3c-5663-7431-932c-28872daaf4b2.png)

#ViewController.swiftの編集

```ViewController.swift
import UIKit

class ViewController: UIViewController, UIImagePickerControllerDelegate,
UINavigationControllerDelegate{

     //　ラベルとimage viewにつなぐ
    @IBOutlet var cameraView : UIImageView!
    @IBOutlet var label : UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
     //文字表示
        label.text = "Tap the [Start] to take a picture"
        
    }
    
    // カメラの撮影開始
    @IBAction func startCamera(_ sender : AnyObject) {
        
        let sourceType:UIImagePickerController.SourceType =
            UIImagePickerController.SourceType.camera
        // カメラが利用可能かチェック
        if UIImagePickerController.isSourceTypeAvailable(
            UIImagePickerController.SourceType.camera){
            // インスタンスの作成
            let cameraPicker = UIImagePickerController()
            cameraPicker.sourceType = sourceType
            cameraPicker.delegate = self
            self.present(cameraPicker, animated: true, completion: nil)
            
        }
        else{
            label.text = "error"
            
        }
    }
    
    //　撮影が完了時した時に呼ばれる
    func imagePickerController(_ imagePicker: UIImagePickerController,
                               didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]){
        
        if let pickedImage = info[.originalImage]
            as? UIImage {
            
            cameraView.contentMode = .scaleAspectFit
            cameraView.image = pickedImage
            
        }
        
        //閉じる処理
        imagePicker.dismiss(animated: true, completion: nil)
        label.text = "Tap the [Save] to save a picture"
        
    }
    
    // 撮影がキャンセルされた時に呼ばれる
    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        picker.dismiss(animated: true, completion: nil)
        label.text = "Canceled"
    }
    
    
    // 写真を保存
    @IBAction func savePicture(_ sender : AnyObject) {
        let image:UIImage! = cameraView.image
        
        if image != nil {
            UIImageWriteToSavedPhotosAlbum(
                image,
                self,
                #selector(ViewController.image(_:didFinishSavingWithError:contextInfo:)),
                nil)
        }
        else{
            label.text = "image Failed !"
        }
        
    }
    
    // 書き込み完了結果の受け取り
    @objc func image(_ image: UIImage,
                     didFinishSavingWithError error: NSError!,
                     contextInfo: UnsafeMutableRawPointer) {
        
        if error != nil {
            print(error.code)
            label.text = "Save Failed !"
        }
        else{
            label.text = "Save Succeeded"
        }
    }
    
    // アルバムを表示
    @IBAction func showAlbum(_ sender : AnyObject) {
        let sourceType:UIImagePickerController.SourceType =
            UIImagePickerController.SourceType.photoLibrary
        
        if UIImagePickerController.isSourceTypeAvailable(
            UIImagePickerController.SourceType.photoLibrary){
            // インスタンスの作成
            let cameraPicker = UIImagePickerController()
            cameraPicker.sourceType = sourceType
            cameraPicker.delegate = self
            self.present(cameraPicker, animated: true, completion: nil)
            
            label.text = "Tap the [Start] to save a picture"
        }
        else{
            label.text = "error"
            
        }
        
    }
    
}

```

@のところ（今回の場合5つ）をストーリーボードと接続しないといけないので、こんな感じに接続します。

![スクリーンショット 2019-03-06 23.51.23.png](https://qiita-image-store.s3.amazonaws.com/0/332034/4b374e80-2159-ad48-cd35-cb453d55198d.png)


一応繋いで起動すれば完成です。

自分のデバイスに入れないとカメラ起動できないはずなのでお気をつけ！！

#起動できない方へ

左の赤丸で囲んだところの矢印がなかったら起動できないです。
ViewControllerをクリックして、右の赤丸まで行ってチェックボックスをクリックすれば無事起動できると思います。



![スクリーンショット 2019-03-06 23.55.48.png](https://qiita-image-store.s3.amazonaws.com/0/332034/fea7a7ad-bcfd-4d33-45c3-2fd235d8cd25.png)


それでは〜