【Swift】UIImageViewに表示された画像を端末に保存しよう

今回はUIImageViewに表示された画像をカメラロールに保存してみました！

##完成形
以下のGIF画像ではCollectionViewで任意の画像を選択後、画面遷移して画像を保存していますが、今回は画面遷移後の画像保存の部分のみを紹介します。

![pixabay.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271820/641db459-13f4-7f12-35de-b83f29bc8227.gif)



##1. UIImageにタップイベントを追加
UIImageViewをタップした時に、そこに含まれているUIImageを取得します。

```swift
import UIKit
 
class ViewController: UIViewController {
 
    override func viewDidLoad() {
        super.viewDidLoad()
 
        //UIImageViewのインスタンスを生成
        let imageView = UIImageView(image: UIImage(named: "sample.png"))
        let width = view.frame.width
        let height = view.frame.height
        imageView.frame.size = CGSize(width: width, height: height/3)
        imageView.contentMode = .scaleAspectFill
        imageView.clipsToBounds = true
         
        // UIImageView にタップイベントを追加
        imageView.userInteractionEnabled = true
        imageView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.saveImage(_:))))
         
        // 画面の中心に UIImageView を配置
        imageView.center = self.view.center
        self.view.addSubview(imageView)
    }

```

```swift
// セーブを行う
    @objc func saveImage(_ sender: UITapGestureRecognizer) {
         
        //タップしたUIImageViewを取得
        let targetImageView = sender.view! as! UIImageView
        // その中の UIImage を取得
        let targetImage = targetImageView.image!
        //保存するか否かのアラート
        let alertController = UIAlertController(title: "保存", message: "この画像を保存しますか？", preferredStyle: .alert)
        //OK
        let okAction = UIAlertAction(title: "OK", style: .default) { (ok) in
            //ここでフォトライブラリに画像を保存
            UIImageWriteToSavedPhotosAlbum(targetImage, self, #selector(self.showResultOfSaveImage(_:didFinishSavingWithError:contextInfo:)), nil)
        }
        //CANCEL
        let cancelAction = UIAlertAction(title: "CANCEL", style: .default) { (cancel) in
            alertController.dismiss(animated: true, completion: nil)
        }
        //OKとCANCELを表示追加し、アラートを表示
        alertController.addAction(cancelAction)
        alertController.addAction(okAction)
        present(alertController, animated: true, completion: nil)
    }
```

```swift
 // 保存結果をアラートで表示
    func showResultOfSaveImage(_ image: UIImage, didFinishSavingWithError error: NSError!, contextInfo: UnsafeMutableRawPointer) {
         
        var title = "保存完了"
        var message = "カメラロールに保存しました"
         
        if error != nil {
            title = "エラー"
            message = "保存に失敗しました"
        }
         
        let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
         
        // OKボタンを追加
        alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
         
        // UIAlertController を表示
        self.present(alert, animated: true, completion: nil)
    }
```

##2. プライバシー設定を変更
コードは以上で完成ですが、もう1つやらなければいけないことがあります。
info.plistの中にあるPrivacyの設定です。追加しなければいけないのは以下の2つです。

+ <b>Privacy - Photo Library Usage Description<b>

+ <b>Privacy - Photo Library Additions Usage Description<b>

上記の2つを追加し、Valueを以下の画像のように変更することで、初回画像保存時にアラートが表示され、ユーザーにフォトライブラリーへのアクセスを許可を要求することができます。

<img width="538" alt="スクリーンショット 2019-06-15 13.47.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271820/f6af071f-7407-02b5-cb73-2c22a3a66748.png">