[iOS] 앨범의 이미지를 선택할 수 있는 PHPickerViewController를 알아보자!

eung7_·2022년 2월 16일
0

iOS

목록 보기
6/17
post-thumbnail

PHPickerViewController가 뭐야?


거의 대부분의 앱에서 볼 수 있는 위와 같이 로컬 라이브러리와 연결하여 사진과 동영상을 선택할 수 있는 것이 바로 PHPickerViewController이다. 그런데 이것은 iOS14+부터 사용이 가능하다. 그 이전에는 UIImagePickerController를 사용했다. Apple은 PHPickerViewController를 새로 발표하여 이전보다 더 안정성을 개선하고 많은 이점을 제공한다고 밝혔다. 그렇다면 어떤 이점이 있길래 그러는 걸까?

개요

  1. 느린 이미지 로딩과 복구 UI 개선
  2. Raw 와 파노라마 이미지의 안정적인 처리 개선
  3. UIImagePickerControll에서 사용할 수 없는 이미지나 동영상 기능 추가
  4. Live Photos만 표시하도록 할 수 있는 기능
  5. 라이브러리 사용 권한 요청 없이 PHLivePhoto 사용 가능
  6. 유효하지 않는 입력에는 엄격한 규제 추가
class PHPickerViewController : UIViewController

Apple에서 정의하는 PHPickerViewController는 UIViewController를 상속받고 있다. 이제 본격적인 구현 방법을 알아보자.


Picker 구성하기

우선 가장 기본적인 PHPickerViewController의 인스턴스를 만들어야한다! 일단 선행되어야 할 것은 PhotosUI를 따르고 있기 때문에, 이것을 import 해줘야 한다. 그리고 인스턴스를 만들기 위해 configuration을 정해줘야한다. PHPickerConfiguration 구조체의 자세한 값들을 보고 싶으면 여기를 클릭해주면 된다!

import photosUI

var configuration = PHPickerConfiguration() // 1.
configuration.selectionLimit = 1 // 2.
configuration.filter = .images // 3.
let picker = PHPickerViewController(configuration: configuration)

PHPickerViewController의 인스턴스를 만들기 위해서는 초기 값으로 PHPickerConfiguration의 인스턴스가 필요하다.

  1. 먼저 PHPickerConfiguration을 생성하여 configuration 변수에 넣어주도록 한다.
  2. configuration.selectionLimit는 최대로 선택할 사진 및 동영상의 개수를 입력해주면 된다.
  3. configuration.fliter는 라이브러리에 접근할 때 적용되는 필터 역할을 한다. 타입은 총 네 가지가 있다. images, livePhotos, videos와 이것들을 짬뽕시킬 수 있는 any가 있다.
static let images: PHPickerFilter
static let livePhotos: PHPickerFilter
static let videos: PHPickerFilter
static func any(of: [PHPickerFilter]) -> PHPickerFilter

마지막으로 구성된 configuration을 가지고 PHPickerViewController의 초기값으로 넣어주면 인스턴스 완성이다.

PHPicker Delegate

이제 PHPicker를 만들었다면, 선택된 이미지를 가지고 놀기 위해 delegate를 채택해야한다.

picker.delegate = self

그리고 PHPickerViewControllerDelegate를 채택하여 필수 메서드를 구현해주도록 하자.

extension FeedViewController : PHPickerViewControllerDelegate { // 1.
    
    func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) { // 2.
        var selectedImage : UIImage?
        
        picker.dismiss(animated: true, completion: nil) // 3.
        
        let itemProvider = results.first?.itemProvider // 4.
        if let itemProvider = itemProvider,
           itemProvider.canLoadObject(ofClass: UIImage.self) { // 5.
            itemProvider.loadObject(ofClass: UIImage.self) { image, error in // 6.
                DispatchQueue.main.async { //
                    guard let selectedImage = image as? UIImage else { return }
                    let uploadViewController = UploadViewController(uploadImage: selectedImage)
                    let navigationController = UINavigationController(rootViewController: uploadViewController)
                    navigationController.modalPresentationStyle = .fullScreen
                    
                    self.present(navigationController, animated: true, completion: nil)
                }
            }
        }
    }
}

위의 소스코드를 차례대로 살펴보도록 하자.

  1. 우선 PHPickerViewDelegate를 채택하였다.
  2. 필수 메서드를 구현해주었다. 이 메서드는 사진을 선택하고 난 후에 실행되는 메서드이다.
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult])
  1. 현재 PHPicker가 사라지도록 구현해주었다.
  2. results의 첫번째 배열의 값을 불러왔다. 여기서 itemProvider는 선택한 아이템을 representation해주는 역할을 한다.
  3. itemProvider의 값이 있고, UIImage로 값을 불러올 수 있을 경우에만 실행하도록 구현
  4. itemProvider에서 UIImage Object를 불러오는 메서드를 구현했다.

https://developer.apple.com/documentation/photokit/phpickerviewcontroller

profile
안녕하세요. SW Engineer eung7입니다.

0개의 댓글