본문 바로가기

프로그래밍/iOS,macOS

폰의 사진, 앨범 가져오기

퍼미션체크


PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];

switch( status )

{

case PHAuthorizationStatusAuthorized:

// 사용가능

break;


case PHAuthorizationStatusNotDetermined:

// 아직 결정하지 않음

[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus authorizationStatus)

{

if( authorizationStatus == PHAuthorizationStatusAuthorized )

{

// 사용가능

} else {

// 사용불가

}

}];

break;

default:

// 사용불가

break;

}



이미지 매니저

PHImageManager *manager = [PHImageManager defaultManager];


request 옵션

PHImageRequestOptions *requestOptions =[PHImageRequestOptions new];

requestOptions.synchronous =

requestOptions.deliveryMode =

 

fetch 옵션

fetch옵션은 fetch하는 클래스에 따라 지원하는 키가 다르다. 

런타임시 크래시 나면서 Unsupported sort descriptor in fetch options 이라고 표시되면, 해당 클래스가 옵션키를 지원하는지

확인해야 한다.

예를들어 PHAssetCollection 클래스는 creationDate키를 제공하지 않는다.


PHFetchOptions *options = [PHFetchOptions new];

// 정렬

options.sortDescriptors = @[ [NSSortDescriptor sortDescriptorWithKey:@“creationDate” ascending:YES] ];

// 특정 조건

options.predicate = [NSPredicate predicateWithFormat:@“creationDate > %@ AND creationDate < %@“, startDate, endDate];


fetchLimit

includeAllBurstAssets

includeHiddenAssets

includeAssetSourceTypes





에셋 가져오기


fetchAssetsWith 로 시작하는 메쏘드들은 해당 에셋들의 그룹을 반환한다. 에셋그룹의 identifier를 알고 있다면

fetchAssetsWithLocalIdentifiers 를 사용할 수 있고, 일반적인 경우 fetchAssetsWithMediaType 을 사용한다.

반환된 그룹을 enumerateObjectsUsingBlock 이나 루프를 돌며 실제 asset에 접근할 수 있다.


PHFetchResult * result = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage option:requestOptions];

NSMutableArray<PHAsset *> *asset = [NSMutableArray array];

[result enumerateObjectsUsingBlock:^(id _Nonnull object, NSUInteger idx, BOOL *_Nonnull stop) {

if([object isKindOfClass:[PHAsset class]]) {

[assets addObject:object];

// 배열등 원하는 형태로 저장

}

}];




PHAssetCollection 사용해 카메라롤 가져오기


PHFetchResult *camera_roll = 

 [PHAssetCollection 

fetchAssetCollectionWithType :PHAssetCollectionTypeSmartAlbum

subtype:PHAssetCollectionSubtypeSmartAlbumUserLibrary

options:fetchOptions];



[camera_roll enumerateObjectsUsingBlock:^(PHAssetCollection *collection, NSUInteger idx, BOOL *stop ) {

// 카메라롤에셋에서 전달된 PHAssetCollection으로 실제 사진의 에셋 얻기

PHFetchResult *assets = [PHAsset fetchAssetsInAssetCollection:collection options:nil];

[assets enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

if( [obj isKindOfClass:[PHAsset class]])

{

// 배열등 원하는 형태로 저장 

}

}];


}];






실제 이미지 가져오기

이미지 가져와 테이블 뷰의 cell에 보이기


cell = get reusable or alloc .....


// 매니저

PHImageManager *manager = [PHImageManager defaultManager];


// 기존 작업 취소

if( cell.tag != 0 ) {

[manager cancelImagerequest:(PHImageRequestID)cell.tag];

}


// 미리 가져온 에셋 배열에서 에셋 얻기

PHAsset *asset = self.assets[indexPath.row];


// PHAsset에서 실제 이미지  얻기

cell.tag = 

  [manager requestImageForAsset:asset

targetSize:CGSizeMake(100.0, 100.0)

contentMode:PHImageContentModeAspectFill

options:requestOptions

resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {

cell.imageView.image = result;

cell.tag = 0;

}];


// 원본사이즈 그대로 가져오려면

targetSize:PHImageManagerMaximumSize

contentMode:PHImageContentModeDefault