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만하고 따로메소드 구현 필요는 없음.)
실습: 카메라로 이미지를 촬영하고, 비디오 촬영을 하고 촬영한 데이터를 가져와서 출력.
-
프로젝트 생성.
-
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 |