iPadとPlaygroundsで学ぶ:アルバム内の写真を読み出す

以前試した、内蔵カメラでの写真撮影と同じ手順でアルバムから写真を取り出すことができます。

手順

カメラと同様にUIImagePickerControllerを使います。 異なるのはsourceTypeの指定だけです。

  1. UIImagePickerControllerのインスタンスを生成する
  2. 生成したインスタンスのsourceTypeにUIImagePickerController.SourceType. photoLibraryを設定する
  3. プロトコルを登録する
  4. presentで生成したインスタンスへ画面遷移する

撮影結果の受け取りもカメラ使用時と同様にプロトコルで受け取ります。

簡単ですね。

アプリの仕様

ビューにボタンを配置しボタンが押されたときにシステムアルバムアプリを起動します。 画像を選択しキャンセルされなかった場合には画面をアルバムに保存します。 (同じ絵が増えます)

コード

以下コードです。

import UIKit

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate  {
    var imagePicker: UIImagePickerController?
    var mainView: UIView?
    var button: UIButton?
    override func viewDidLoad() {
        createElements()
        setAnchorConstraint()
    }
    func createElements() {
        self.imagePicker = UIImagePickerController()
        self.mainView = UIView()
        self.button = UIButton()
        guard
            let mainView = self.mainView,
            let button = self.button else {
                return
        }
        button.backgroundColor = UIColor.magenta
        button.addTarget(self, action:#selector(self.buttonEvent(_:)), for: UIButton.Event.touchUpInside)
        mainView.addSubview(button)
        self.view = mainView
    }
    func setAnchorConstraint() {
        guard
            let mainView = self.view,
            let button = self.button else {
                return
        }
        button.translatesAutoresizingMaskIntoConstraints = false
        button.centerXAnchor.constraint(equalTo:mainView.centerXAnchor).isActive = true
        button.bottomAnchor.constraint(equalTo:mainView.bottomAnchor, constant: -100).isActive = true
        button.widthAnchor.constraint(equalToConstant:60).isActive = true
        button.heightAnchor.constraint(equalToConstant:30).isActive = true
    }
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        // 画像データを取り出す
        if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
            // アルバムへ保存
      UIImageWriteToSavedPhotosAlbum(image,self,#selector(self.imageSavingEvent(_:didFinishSavingWithError:contextInfo:)), nil)
        }
        // 遷移元へ戻る
        picker.dismiss(animated:true, completion:nil)
    }
    // カメラを起動するボタンのイベント
    @objc func buttonEvent(_ sender: UIButton) {
        guard let imagePicker = self.imagePicker else {
            return
        }
        // UIImagePickerControllerの設定
        imagePicker.sourceType = UIImagePickerController.SourceType.photoLibrary
        // protocolを設定
        imagePicker.delegate = self
        // 画面遷移
        present(imagePicker, animated:true, completion:nil)
    }
    // 画像をライブラリに保存したときのイベント(エラーの場合も呼ばれる)
    @objc func imageSavingEvent(_ image: UIImage, didFinishSavingWithError error: Error?, contextInfo: UnsafeRawPointer) {
    }
}

import PlaygroundSupport
PlaygroundPage.current.liveView = ViewController()