2017年10月30日月曜日

アルバムから写真を取得して表示する(UIImagePickerController)

UIImagePickerControllerを使って写真を取得してUIImageViewに表示します。
動作としては、
1. ImageViewをタップするとpicker controllerが表示
2. picker controllerで写真を選択するとImgeViewに写真を表示
となります。

1. info.plistに "Privacy - Photo Library Usage Description"を追加して、Valueにメッセージ("アルバムにアクセスします"とか)を記載します。
2. MainStoryBoardにImaveViewを配置しますし、ViewControllerにIBOutlet接続します。
        @IBOutlet weak var photoView: UIImageView! とか
3. ViewControllerクラスの継承元に以下を追加する
  UIImagePickerControllerDelegate,
   UINavigationControllerDelegate
  こんな感じになる↓
  class ViewController: UIViewController , UIImagePickerControllerDelegate, UINavigationControllerDelegate

4. クラスメンバに変数追加
      var imagePicker: UIImagePickerController!
    let tagPhotoView = 1
5. ViewDidLoadedに以下の処理を記載 (ViewDidLoadedでimagepickerControllerを起動させようとするとエラーが出るのでやってないというか)
     override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
      
        // viewにタグを設定(本筋ではないがImageViewをタッチした際にpicker controllerを表示させるため)
        photoView.tag = tagPhotoView
      
        // インスタンス生成
        imagePicker = UIImagePickerController()
       
        // デリゲート設定
        imagePicker.delegate = self
      
        // 画像の取得先はフォトライブラリとする(カメラにするとカメラを起動した撮影した画像を取得できるみたい)
        // この段階ではImagePickerは起動させません
        imagePicker.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
        // self.presentViewController(imagePicker, animated: true, completion: nil)
    }

4. ViewControllerがタップされたらImagePicker controllerを起動するコード
    /*
        user interaction enable / multiple touchをチェックしておく
     */
    override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
        super.touchesEnded(touches, withEvent: event)
        for touch: UITouch in touches {
            let tag = touch.view!.tag
            switch tag {
            case tagPhotoView:
                self.presentViewController(imagePicker, animated: true, completion: nil)
            default:
                // self.presentViewController(imagePicker, animated: true, completion: nil)
                break
            }
        }
    }

5. imagePickerControllerで画面が選択されたら呼ばれる関数を記述
    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject])
    {
        // Add your functionality here
        //選択された画像を取得.
        let selectedImage: AnyObject?  = info[UIImagePickerControllerOriginalImage]
       
        //選択された画像を表示するViewContorllerにセットする.
        photoView.image = (selectedImage as! UIImage)
       
        // モーダルビューを閉じる
        self.dismissViewControllerAnimated(true, completion: nil)

        // ステータスバーの非表示 (ただし、時計表示などは消えないみたい)
        // self.setNeedsStatusBarAppearanceUpdate()
    }
   
     // 画像選択がキャンセルされた時に呼ばれる.   
    func imagePickerControllerDidCancel(picker: UIImagePickerController) {       
        // モーダルビューを閉じる
        self.dismissViewControllerAnimated(true, completion: nil)    
    }

とりあえず上記実装で意図した動作はするようです。


ソースコード全体
// 本アプリは以下の動作をします
// 1. ImageViewをタップするとpicker controllerが表示
// 2. picker controllerで写真を選択するとImgeViwに写真を表示

import UIKit

class ViewController: UIViewController , UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    var imagePicker: UIImagePickerController!
    @IBOutlet weak var photoView: UIImageView!
    let tagPhotoView = 1
   
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
       
        // viewにタグを設定(本筋ではないがImageViewをタッチした際にpicker controllerを表示させるため)
        photoView.tag = tagPhotoView
       
        // インスタンス生成
        imagePicker = UIImagePickerController()
       
       
        // デリゲート設定
        imagePicker.delegate = self
       
        // 画像の取得先はフォトライブラリとする(カメラにするとカメラを起動した撮影した画像を取得できるみたい)
        // この段階ではImagePickerは起動させません(エラーになるから...)
        imagePicker.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
        self.presentViewController(imagePicker, animated: true, completion: nil)
    }

    override func viewDidAppear(animated: Bool) {
       
    }
   
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
   
    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject])
    {
        // Add your functionality here
        //選択された画像を取得.
        let selectedImage: AnyObject?  = info[UIImagePickerControllerOriginalImage]
       
        //選択された画像を表示するViewContorllerにセットする.
        photoView.image = (selectedImage as! UIImage)
       
        // モーダルビューを閉じる
        self.dismissViewControllerAnimated(true, completion: nil)
    }
   
   
     // 画像選択がキャンセルされた時に呼ばれる.
    func imagePickerControllerDidCancel(picker: UIImagePickerController) {
        // モーダルビューを閉じる
        self.dismissViewControllerAnimated(true, completion: nil)
       
    }
   
    // user interaction enable / multiple touchをチェックしておく
    override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
        super.touchesEnded(touches, withEvent: event)
        for touch: UITouch in touches {
            let tag = touch.view!.tag
            switch tag {
            case tagPhotoView:
                self.presentViewController(imagePicker, animated: true, completion: nil)
            default:
                break
            }
        }
    }
}

覚書...
ViewDidLoadedでimage picker controllerを起動させた時に表示されるエラーメッセージ
PhotoViewer01[27898:560863] Warning: Attempt to present <UIImagePickerController: 0x7fcd3300f600> on <PhotoViewer01.ViewController: 0x7fcd32622b10> whose view is not in the window hierarchy!
 


0 件のコメント:

コメントを投稿