사용자의 media library에서 사진 촬영, 동영상 녹화 및 사진 선택을 위한 시스템 인터페이스를 관리하는 ViewController이다
@MainActor class UIImagePickerController : UINavigationController
신기하게도 NavigationController를 상속받고 있다
UIImagePickerController
는 사용자 상호 작용을 관리하고 이러한 상호 작용의 결과를 delegate object에 전달한다. image picker controller
의 role과 appearance는 해당 image picker controller
를 present하기 이전에 source type에 할당한 값에 따라 달라진다
UIImagePickerController.SourceType.camera
의 경우는 실행되는 장치에서 새 사진 또는 동영상을 촬영하기 위한 사용자 인터페이스를 제공할 것이다UIImagePickerController.SourceType.photoLibrary
혹은 UIImagePickerController.SourceType.savedPhotoAlbum
의 경우는 저장되어 있는 사진과 영상들 중에서 고를 수 있도록 해주는 UI를 제공해줍니다기본적으로 제공되는 controller 이 포함된 UIImagePickerController
를 사용하려면 다음 아래 단계를 수행해보자!
isSourceTypeAvailable(_:)
클래스 메서드를 호출하여 확인해보고 싶은 타입 UIImagePickerController.SourceType
을 넣어서 Bool 값을 확인한다!!class func isSourceTypeAvailable(_ sourceType: UIImagePickerController.SourceType) -> Bool
sourceType
에서 사용할 수 있는 mediaType
을 확인하려면 availableMediaTypes(for:)
클래스 메서드를 호출한다. 이를 통해서 사진만 사용할 수 있는지 비디오도 사용할 수 있는지 구별할 수 있다class func availableMediaTypes(for sourceType: UIImagePickerController.SourceType) -> [String]?
Image Picker Controller
에 지시한다present(_: animated: completion: )
메서드를 이용해서 iPhone, iPad touch 의 경우는 (full screen) modal 창을 띄우며, iPad의 경우는 source type에 따라 아래와 같이 present를 한다delegate
개체를 이용하여 image picker
를 dismiss 합니다. 카메라로 새롭게 찍어진 media의 경우는 delegate
가 해당 디바이스 카메라 롤에 저장할 수 있다. 이전에 저장한 media의 경우 대리인이 앱의 목적에 따라 이미지 데이터를 사용할 수 있다image picker controller
를 사용하기 위해서는, UIImagePickerControllerDelegate
를 채택해서 delegate
를 사용해야만 한다.
해당 프로토콜의 method는 image or movie를 선택하거나 혹은 picker의 작동을 취소했을 때, delegate에 알린다. delegate method
는 작동이 완료되었을 때 picker를 dismiss하는 책임을 가지고 있다.
image picker controller
를 해제하기 위해서는, dismissModalViewController(animated:)
를 UIImagePickerController
를 실행시킨 책임이 있는 부모 controller에서 호출해야한다.
Camera Roll Album
에서 유저가 저장한 이미지를 저장하기 위해서는, UIImageWriteToSavedPhotosAlbum(_:_:_:_:)
함수를 imagePickerController(_:didFinishPickingMediaWithInfo:)
메서드 내부에 호출해준다. 비디오를 저장하기 위해서는 UISaveVideoAtPathToSavedPhotosAlbum(_:_:_:_:)
함수를 호출한다. 추가적인 메타데이터를 쓰기위해서는 Photos
프레임워크의PHAssetChangeRequest
를 사용해주자
@IBAction private func touchAddImageButton(_ sender: Any) {
let imagePicker = UIImagePickerController()
imagePicker.modalPresentationStyle = .fullScreen
imagePicker.sourceType = .photoLibrary
imagePicker.allowsEditing = true
imagePicker.delegate = self
self.present(imagePicker, animated: true)
}
extension ItemEditViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate{
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
self.dismiss(animated: true)
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
let image = info[UIImagePickerController.InfoKey.editedImage] as? UIImage
if firstImageView.image == nil {
firstImageView.image = image
} else if secondImageView.image == nil {
secondImageView.image = image
} else if thirdImageView.image == nil {
thirdImageView.image = image
} else if fourthImageView.image == nil {
fourthImageView.image = image
} else if fifthImageView.image == nil {
fifthImageView.image = image
}
self.dismiss(animated: true, completion: nil)
}
}
This app has crashed because it attempted to access privacy-sensitive data without a usage description. The app’s Info.plist must contain an NSCameraUsageDescription key with a string value explaining to the user how the app uses this data.
만약에 plist
에 Privacy - Camera Usage Description
, Privacy - Photo Library Usage Description
를 설정하지 않을 경우 위 같은 에러가 발생한다
UIImagePickerController
를 학습하고 사용해보고 느낀점
장점
photos 프레임워크와는 다르게 쉽게 구현이 가능하다
단점
여러 개의 이미지를 한꺼번에 선택할 수 없다. 하나씩 선택하고 편집해야 하는 작업이 사용자에게 있어서 불편함을 느끼게 할 것이다
참고자료)
https://developer.apple.com/documentation/uikit/uiimagepickercontroller
https://jinshine.github.io/2018/07/06/iOS/UIImagePickerController%20예제/