거의 대부분의 앱에서 볼 수 있는 위와 같이 로컬 라이브러리와 연결하여 사진과 동영상을 선택할 수 있는 것이 바로 PHPickerViewController이다. 그런데 이것은 iOS14+부터 사용이 가능하다. 그 이전에는 UIImagePickerController를 사용했다. Apple은 PHPickerViewController를 새로 발표하여 이전보다 더 안정성을 개선하고 많은 이점을 제공한다고 밝혔다. 그렇다면 어떤 이점이 있길래 그러는 걸까?
class PHPickerViewController : UIViewController
Apple에서 정의하는 PHPickerViewController는 UIViewController를 상속받고 있다. 이제 본격적인 구현 방법을 알아보자.
우선 가장 기본적인 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의 인스턴스가 필요하다.
static let images: PHPickerFilter
static let livePhotos: PHPickerFilter
static let videos: PHPickerFilter
static func any(of: [PHPickerFilter]) -> PHPickerFilter
마지막으로 구성된 configuration을 가지고 PHPickerViewController의 초기값으로 넣어주면 인스턴스 완성이다.
이제 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)
}
}
}
}
}
위의 소스코드를 차례대로 살펴보도록 하자.
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult])
https://developer.apple.com/documentation/photokit/phpickerviewcontroller