develop

PHAsset 본문

iOS

PHAsset

pikachu987 2020. 12. 29. 09:58
반응형

1. Info.plist

Privacy - Photo Library Usage Description을 추가한다.

 

2. import

Photos 를 import한다.

import Photos

 

3. PHPhotoLibraryChangeObserver

PHPhotoLibraryChangeObserver 를 컨트롤러에 등록한다.

PHPhotoLibraryChangeObserver 는 이미지가 추가되거나 삭제되거나 수정됬을때 호출이 된다.

deinit될때 해제되어야 한다.

class ViewController: UIViewController {
    deinit {
        PHPhotoLibrary.shared().unregisterChangeObserver(self)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        PHPhotoLibrary.shared().register(self)
    }  
}

// MARK: PHPhotoLibraryChangeObserver
extension ViewController: PHPhotoLibraryChangeObserver {
    func photoLibraryDidChange(_ changeInstance: PHChange) {
        // fetchData
    }
}

 

4. 이미지 Authorization

이미지 권한 체크를 한다.

if PHPhotoLibrary.authorizationStatus() == .authorized || PHPhotoLibrary.authorizationStatus() == .limited {
    // fetchData
} else if PHPhotoLibrary.authorizationStatus() == .denied {
    print("Permission Denied")
} else {
    PHPhotoLibrary.requestAuthorization() { (status) in
        switch status {
        case .authorized:
            // fetchData
            break
        default:
            print("Permission Denied")
        }
    }
}

 

5. 앨범 리스트 가져오기

앨범 리스트를 가져온다.

PHAssetCollection.fetchAssetCollections(with: PHAssetCollectionType.smartAlbum, subtype: PHAssetCollectionSubtype.any, options: PHFetchOptions()).enumerateObjects { (collection, _, _) in
    let count = PHAsset.fetchAssets(in: collection, options: nil).count // 앨범안의 사진 갯수
    print(collection) // 앨범
}

 

6. 앨범을 통해 사진을 가져오기

앨범을 통해 사진 리스트를 가져온다.

var assets = [PHAsset]()
PHAsset.fetchAssets(in: collection, options: PHFetchOptions()).enumerateObjects({ (asset, _, _) in
    assets.append(asset)
})
print(assets)

 

7. PHAsset의 이미지 추출

PHCachingImageManager를 이용하여 PHAsset의 이미지를 추출한다.

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: PictureCell.identifier, for: indexPath) as? PictureCell else { fatalError() }

    let imageRequestOptions = PHImageRequestOptions()
    imageRequestOptions.isSynchronous = true
    imageRequestOptions.resizeMode = .fast
    imageRequestOptions.isNetworkAccessAllowed = true
    imageRequestOptions.deliveryMode = .highQualityFormat

    let size = CGSize(width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.width)
    PHCachingImageManager().requestImage(for: self.assets[indexPath.row], targetSize: size, contentMode: .aspectFit, options: imageRequestOptions, resultHandler: { (image, _) in
        cell.image = image
    })

    return cell
}

 

8. PHAsset의 이미지를 가져올때 progress 숫자 표시하기

PHImageRequestOptions을 이용하여 iCloud에 있는 이미지를 가져올때 progress를 표시할수 있게 한다.

let imageRequestOptions = PHImageRequestOptions()
imageRequestOptions.isSynchronous = true
imageRequestOptions.deliveryMode = .highQualityFormat
imageRequestOptions.isNetworkAccessAllowed = true
imageRequestOptions.progressHandler = { (progress, error, stop, info) in
    DispatchQueue.main.async {
        self.label.text = String(format: "%.1f", progress*100).appending("%")
    }
}
PHCachingImageManager().requestImage(for: asset, targetSize: PHImageManagerMaximumSize, contentMode: .aspectFit, options: imageRequestOptions, resultHandler: { (image, _) in
    DispatchQueue.main.async {
        self.imageView.image = image
        self.activityIndicatorView.isHidden = true
        self.label.isHidden = true
    }
})

 

예제.zip
0.03MB

반응형

'iOS' 카테고리의 다른 글

Image Face Detector 사진에서 얼굴 찾기  (0) 2020.12.30
Text Gradation 텍스트에 그라데이션 추가  (0) 2020.12.29
Preview (PDF, EXCEL)  (0) 2020.12.28
UDID UUID ADID  (0) 2020.12.27
UIBezierPath Shape (도형 그리기)  (0) 2020.12.27
Comments