[iOS] UIImagePickerController

Youngwoo Lee·2021년 8월 31일
1

iOS

목록 보기
24/46
post-thumbnail
post-custom-banner

UIImagePickerController

사용자의 media library에서 사진 촬영, 동영상 녹화 및 사진 선택을 위한 시스템 인터페이스를 관리하는 ViewController이다


@MainActor class UIImagePickerController : UINavigationController

신기하게도 NavigationController를 상속받고 있다

Overview

Source Type

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 를 사용하려면 다음 아래 단계를 수행해보자!

  1. device가 원하는 소스에서 컨텐츠를 선택할 수 있는지 확인해봐야 한다. 이 작업을 수행하려면 isSourceTypeAvailable(_:) 클래스 메서드를 호출하여 확인해보고 싶은 타입 UIImagePickerController.SourceType 을 넣어서 Bool 값을 확인한다!!
class func isSourceTypeAvailable(_ sourceType: UIImagePickerController.SourceType) -> Bool
  1. 특정 sourceType에서 사용할 수 있는 mediaType을 확인하려면 availableMediaTypes(for:) 클래스 메서드를 호출한다. 이를 통해서 사진만 사용할 수 있는지 비디오도 사용할 수 있는지 구별할 수 있다
class func availableMediaTypes(for sourceType: UIImagePickerController.SourceType) -> [String]?
  1. mediaTypes 프로퍼티 값을 설정함으로써 사용할 미디어 유형에 따라 UI를 조정할 수 있도록 Image Picker Controller 에 지시한다
  1. present(_: animated: completion: ) 메서드를 이용해서 iPhone, iPad touch 의 경우는 (full screen) modal 창을 띄우며, iPad의 경우는 source type에 따라 아래와 같이 present를 한다
    • camera : Use full screen
    • Photo Library : Must use a popover
    • Saved Photos Album : Must use a popover
  1. 유저가 새로 찍거나 저장되어있던 이미지 혹은 비디오를 선택하기 위해서 버튼을 눌렀을 때 혹은 작업을 취소하면 delegate 개체를 이용하여 image picker 를 dismiss 합니다. 카메라로 새롭게 찍어진 media의 경우는 delegate 가 해당 디바이스 카메라 롤에 저장할 수 있다. 이전에 저장한 media의 경우 대리인이 앱의 목적에 따라 이미지 데이터를 사용할 수 있다

Providing a Delegate Object

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.

만약에 plistPrivacy - 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예제/

profile
iOS Developer Student
post-custom-banner

0개의 댓글