본문 바로가기

iOS

iOS - ImagePicker (이미지 피커)

 

Image Picker는 UIImagePickerController 클래스를 사용하여 구현하는데요, 순서는 아래와 같이 진행하면 실수를 줄일 것 같습니다. 주의할 사항은 UIImagePickerController는 스토리보드로 생성하는 것은 안되며, 코드로만 생성이 가능합니다.

1. 이미지피커컨트롤러 인스턴스 생성.

let imagePicker = UIImagePickerController() 

2. 델리게이트를 self로 지정 

imagePicker.delegate = self 

3. Source Type을 지정 

imagePicker.sourceType = .photolibrary 

***카메라 사용과 포토 라이브러리 이용 등 여기서 source type을 선택해 주시면 됩니다. 

4. 이미지피커컨트롤러를 출력

self.present(imagePicker, animated: true) 

 

실제로 사진을 선택하거나 촬영한 이미지는 UIImagePickerControllerDelegate 프로토콜의 메소드를 이용해서 가져 올 수 있는데요, 특이사항은 이 프로토콜을 구현할때는 추가로 UINavigationControllerDelegate 프로토콜도 conform해야 합니다.

 

  • UIViewController로부터 상속받는 UIImagePickerController 클래스를 사용.

  • 인스턴스를 만들고 sourceType속성에 접근하고자 하는 기능(PhotoLibrary, Camera)을 설정.

  • 다른 뷰 컨트롤러 출력하듯이 출력하면 됨.

  • 실제 선택하거나 촬영한 이미지는 UIImagePickerControllerDelegate 프로토콜의 메소드를 이용해서 가져 올 수 있음. 

  • 이 프로토콜을 구현할 때는 UINavigationControllerDelegate프로토콜도 conform해야 함. (특이사항: conform만하고 따로메소드 구현 필요는 없음.)

실습: 카메라로 이미지를 촬영하고, 비디오 촬영을 하고 촬영한 데이터를 가져와서 출력.

  1. 프로젝트 생성. 

  2. VC화면에 ImageView1개와 버튼 4개를 작성(이 때, 버튼 4개 대신에 SegmentedControl이용 - valueChanged이벤트를 구현해서 선택된 인덱스를 찾아서 분기를 해야 함.) 

- 사진촬영, 사진출력, 비디오촬영, 비디오재생

3. ImageView는 변수로 연결: imageView

  • 버튼은 touchUpInside이벤트에 메소드를 연결

  • segmented control은 valueChanged 이벤트에 메소드를 연결 

4. 4개의 인스턴스 변수 선언

  • UIImagePickerController 

  • 가져온 이미지를 저장하기 위한 UIImage

  • 비디오재생 URL:URL

  • 이미지 저장 여부: Bool

    //이미지 피커 컨트롤러 인스턴스 생성

    let imagePickerController = UIImagePickerController()

    //가져온 이미지를 저장하기 위한 변수

    var captuerImage : UIImage!

    //비디오재생 위치

    var videoURL : URL!

    //이미지저장 여부

    var flagImageSave : Bool

 

5. 사진출력버튼을 클릭하면 호출되는 메소드에 코드를 추가. 

 @IBAction func usePhoto(_ sender: Any) {

        //이미지 저장 기능을 사용하지 않기 떄문에 설정.

        flagImageSave = false

        //이미지를 선택하거나 선택을 취소했을 때 호출될 메소드의 위치를 설정.

        imagePickerController.delegate = self

        //이미지 피커의 데이터 소스 속성을 PhotoLibrary로 설정

        imagePickerController.sourceType = .photoLibrary

        //편집가능여부

        imagePickerController.allowsEditing = true

        //화면에 출력

        self.present(imagePickerController, animated: true)

    }

6. ViewController클래스의 extension을 생성해서 UIImagePickerDelegate와 UINavigationControllerDelegate 프로토콜을 conform하고 이미지를 선택했을 때와 그렇지 않았을 때 호출되는 메소드를 작성.

extension ViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate{

    //이미지를 선택했을 때 호출되는 메소드

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {

        //이미지와 동영상을 구분하기 위해서 타입을 가져옴.

        let mediaType =

            info[UIImagePickerController.InfoKey.mediaType] as! NSString

        if mediaType.isEqual(to: kUTTypeImage as NSString as String){

            //선택한 이미지 가져오기

            captureImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage

            //저장모드라면 저장

            if flagImageSave{

                UIImageWriteToSavedPhotosAlbum(captureImage, self, nil, nil)

            }

            //이미지 출력

                imageView.image = captureImage

            }

//이미지 피커를 닫기 (꼭 포함 시켜야 함.)

        self.dismiss(animated: true, completion: nil)

    }

    //이미지 선택을 취소했을 때 호출되는 메소드

    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {

        //이미지피커 컨트롤러를 화면에서 제거 

        self.dismiss(animated: true, completion: nil)

    }

    

}

 

7. ViewController.swift파일에 MobileCoreServices를 import

import MobileCoreServices 

 

8. info.plist파일에 PhotoLibrary의 데이터를 사용할 때 보여질 메시지를 추가 

  • privacy로 시작되는 태그임.

<key>NSPhotoLibraryUsageDescription</key>

<string>포토라이브러리에서 데이터를 읽어옵니다.</string>

혹은

 

9. 사진촬영을 눌렀을때 불러오는 메소드 생성. 

   @IBAction func takePicture(_ sender: Any) {

        //이미지 저장 기능을 사용해야 하기 때문에 설정.

        flagImageSave = true

        //이미지를 선택하거나 선택을 취소했을 때 호출될 메소드이 위치를 설정.

        imagePickerController.delegate = self

        //이미지 피커의 데이터 소스 속성을 camera 로 설정

        imagePickerController.sourceType = .camera

        //편집가능여부

        imagePickerController.allowsEditing = true

        //화면에 출력

        self.present(imagePickerController, animated: true)

    }

10. info.plist파일에 카메라사용을 위한 메시지와 PhotoLibary에 이미지를 추가하기 위한 메시지를 만들어 주어야 함. 

혹은

<key>NSCameraUsageDescription</key>

<string>카메라사용이 필요합니다.</string>

<key>NSPhotoLibraryAddUsageDescription</key>

<string>사진저장이 필요합니다.</string>

'iOS' 카테고리의 다른 글

iOS - Cocoa Pods  (0) 2020.04.09
iOS - Custom Fonts  (0) 2020.04.01
iOS - Application 배포  (0) 2020.03.26
iOS - CoreData  (0) 2020.03.25
iOS - URLSession  (0) 2020.03.18