PhotoKit(3)
작성일
지난 포스트에 PhotoKit의 용어만 정리하였고, 이제 어떻게 사용하는지를 작성하려고 한다.
사진이미지 가져오기
우선, 마지막에 설명했던 PHImageManager를 이용해서 이미지를 가져오려고한다.
class ImageManger {
static var shared = ImageManger()
fileprivate let imageManager = PHImageManager()
var representedAssetIdentifier: String?
// 사진가져오기
func requestIamge(with asset: PHAsset?, thumbnailSize: CGSize, completion: @escaping (UIImage?) -> Void) {
guard let asset = asset else {
completion(nil)
return
}
self.representedAssetIdentifier = asset.localIdentifier
self.imageManager.requestImage(for: asset, targetSize: thumbnailSize, contentMode: .aspectFill, options: nil, resultHandler: { image, _ in
if self.representedAssetIdentifier == asset.localIdentifier {
completion(image)
}
})
}
}
전에 말했다 싶이 Aseet은 메타정보 만 가지고있기 때문에,
사진을 가져오려면 PHImageManager의 인스턴스를 만들어준 후, 접근을 해야한다.
requestImage()함수를 사용해서, asset을 넣어준후, targetSize 화질을 넣어주고, contentMode를 설정한후,
options이 필요하면 넣어주고, 결과값을 클로져로 받아서 사용해 주면 된다.
실제로 내가 사용한 코드는
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier.albumCell, for: indexPath) as! AlbumCell
cell.selectionStyle = .none
guard let result = self.fetchResult else { return cell }
let fetchCollection = result[indexPath.row]
cell.albumTitle.text = fetchCollection.localizedTitle // 앨범의 제목
let fetchOption = PHFetchOptions()
fetchOption.fetchLimit = 0
fetchOption.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
let fetchAsset = PHAsset.fetchAssets(in: fetchCollection , options: fetchOption)
cell.albumImageCount.text = String(fetchAsset.count) // 앨범의 이미지 개수
DispatchQueue.main.async {
ImageManger.shared.requestIamge(with: fetchAsset[indexPath.row]) { image in
cell.albumImageView.image = image
}
}
return cell
}
이런식으로 작성하고, 사용하였다.
PHAsset 이미지 파일명과, 파일 크기 가져오는 방법
이 방법 같은 경우에 asset이 아나라 PHAssetResource에 접근을 해서 가져와야한다.
let asset = self.assets.object(at: indexPath.row)
let resources = PHAssetResource.assetResources(for: asset)
let filename = resources.first!.originalFilename
//MB로 변환 함수 작성
func getMBSize(_ value: CLong) -> String {
var sizeOnDisk: Int64 = 0
var byte = ""
sizeOnDisk = Int64(bitPattern: UInt64(value))
byte = String(format: "%.0f", Double(sizeOnDisk) / (1024.0 * 1024.0))+" MB"
return byte
}
}
let unsignedInt64 = resource.value(forKey: "fileSize") as? CLong
self.getMBSize(unsignedInt64) // 파일크기를 MB 로 가져온 값
이런식으로 작성해 주면 된다.