ios
[ios - Swift] PHCachingImageManager 사용하기
POKY_0908
2020. 12. 14. 09:43
이번 글에서는 포토 라이브러리를 만들어볼 예정입니다.
포토 라이브러리에 접근하는 방법은 PHImageManager, PHCachingImageManager 두 가지이며 사용방법은 동일합니다.
PHCachingImageManager를 사용하는 것이 이미지를 빨리 가져올 수 있으므로 PHCachingImageManager을 사용하도록 하겠습니다.
let imageManager:PHCachingImageManager = PHCachingImageManager()
var imageFetch: PHFetchResult<PHAsset>?
공유 이미지 관리자 개체와 사진에 대한 메타데이터를 관리할 수 있는 리스트를 선언해 주도록 합니다.
PHAsset 에는 사진이 아닌 메타데이터만을 가지고 있습니다.
func loadPHCachingImage() {
let fetchOptions = PHFetchOptions()
fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
self.imageFetch = PHAsset.fetchAssets(with: .image, options: fetchOptions)
}
viewDidLoad에서 호출할 함수이며 공유 이미지를 파일 생성 날짜순 정렬해 검색하는 부분입니다.
이제 collectionView를 이용해 이미지를 요청하도록 하겠습니다.
extension PhotoViewController: UICollectionViewDataSource {
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return imageFetch?.count ?? 0
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "PhotoCollectionViewCell", for: indexPath) as! PhotoCollectionViewCell
let width = (collectionView.frame.width - 3) / 3
let size = CGSize(width: width, height: width)
if let asset:PHAsset = self.imageFetch?.object(at: indexPath.row) {
self.imageManager.requestImage(for: asset,
targetSize: size,
contentMode: .aspectFill,
options: nil) { (image, error) in
cell.imageView.image = image
}
}
return cell
}
}
공유 이미지 관리자 개체에 메타데이터에 해당하는 이미지를 요청하도록 합니다.
이때 옵션은 nil 이라고 했지만 PHImageRequestOption 을 사용하여 아래와 같은 옵션을 추가로 사용할 수 있습니다.
isSynchronous = true : 이미지 요청을 동기로 처리
requsetOptions.deliveryMode = .fastFormat : 이미지 품질
requsetOptions.resizeMode = .fast : none:조정안함, fast:기존과 비슷하거나 큼, exact:일치하도록