22
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-06-15

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

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

pixabay.gif

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

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)
    }

// セーブを行う
    @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)
    }
 // 保存結果をアラートで表示
    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つです。

  • Privacy - Photo Library Usage Description

  • Privacy - Photo Library Additions Usage Description

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

スクリーンショット 2019-06-15 13.47.44.png
22
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?