PhotoKit
一、常用類介紹
- PHAsset:代表照片庫中的一個資源,普通圖片、livephoto或者視頻
- PHFetchOptions:獲取資源時的參數
- PHFetchResult:表示一系列的資源集合,也可以是相冊的集合也可以是照片的集合
- PHAssetCollection:表示一個相冊
- PHImageManager:用於處理資源的加載,加載圖片的過程帶有緩存處理,可以通過傳入一個 PHImageRequestOptions 控制資源的輸出尺寸等規格
- PHImageRequestOptions:加載圖片是的參數
二、基本使用
做一個圖片選擇的思路:獲取權限—列出所有相冊—列出相冊中的圖片
使用時需要導入Photos/Photos.h
獲取訪問圖片庫的權限
PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
//PHAuthorizationStatusNotDetermined 還沒有決定是同意還是拒絕
//PHAuthorizationStatusRestricted 沒有權限訪問,這個用戶需要在系統設置裏更改
//PHAuthorizationStatusDenied 用戶拒絕訪問
//PHAuthorizationStatusAuthorized 已經授權可以訪問相冊
if(status != PHAuthorizationStatusAuthorized){
//使用類方法獲取權限
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
if(status == PHAuthorizationStatusAuthorized){
//同意訪問,繼續下一步
}else{
//拒絕訪問,做出相應操作
}
}];
}else{
//已經有權限,繼續下一步
}
直接獲取獲取所有照片
//創建一個篩選條件,只需要圖片類型,然後按時間倒序排列
PHFetchOptions *option = [[PHFetchOptions alloc] init];
option.predicate = [NSPredicate predicateWithFormat:@"self.mediaType==1"];
option.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:NO]];
//獲取所有圖片,PHFetchResult在這裏是照片的集合
PHFetchResult *allPhotos = [PHAsset fetchAssetsWithOptions:allPhotosOptions];
獲取相冊
獲取相冊需要使用PHAssetCollection的類方法
+ (PHFetchResult<PHAssetCollection *> *)fetchAssetCollectionsWithType:(PHAssetCollectionType)type subtype:(PHAssetCollectionSubtype)subtype options:(nullable PHFetchOptions *)options;
//PHAssetCollectionType 相冊類型
//PHAssetCollectionTypeAlbum 用戶創建的相冊還有一個包含所有照片的相冊,基本都用這個
//PHAssetCollectionTypeSmartAlbum 系統給分類的智能相冊,有很多基本很少用
//PHAssetCollectionTypeMoment 以時刻分類的相冊
//PHAssetCollectionSubtype 相冊子類型,這個一般都用PHAssetCollectionSubtypeAny,如果有特別需求可以自行看文檔選擇
//獲取相冊的集合,PHFetchResult在這裏是相冊的集合
PHFetchResult *albumResult = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAny options:nil];
獲取相冊裏的照片集合
//這裏是接着上面獲取相冊來的
//遍歷循環相冊集合
for(PHAssetCollection *collection in albumResult){
//通過PHAsset的類方法獲取相冊裏的資源,這裏的option條件是隻要照片
PHFetchResult *result = [PHAsset fetchAssetsInAssetCollection:collection options:option];
}
獲取照片資源
PHCachingImageManager *manager = [[PHCachingImageManager alloc] init];
for(PHAsset *asset in result){
[manager requestImageForAsset:asset targetSize:CGSizeMake(_imageScale, _imageScale) contentMode:PHImageContentModeAspectFill options:nil resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
if([cell.imageIdentifier isEqualToString:asset.localIdentifier]){
cell.imageView.image = result;
}
}];
}
//targetSize 這個不要太大,一般根據你需要顯示的尺寸的2倍就夠了,再大的話內存不夠容易崩潰
注:PHCachingImageManager爲PHImageManager的子類,該類加載圖片時使用了緩存機制,也可是使用該方法提前緩存圖片
坑:如果使用上述代碼加載的話,返回圖片尺寸並不是你想要的尺寸,這是因爲沒有設置opiton參數,系統會以效率最高的方式加載圖片,如果想要返回準確的尺寸圖片請參考下面的代碼
PHImageRequestOptions *option = [[PHImageRequestOptions alloc] init];
option.resizeMode = PHImageRequestOptionsResizeModeExact;
option.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;
[_imageManager requestImageForAsset:asset targetSize:CGSizeMake(kWindowWidth*2, kWindowHeight*2) contentMode:PHImageContentModeAspectFit options:option resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
}];
小結:這裏只是介紹了我項目中需要用到的東西,應該能滿足大部分需要,當然還有好多保存圖片之類的功能沒有介紹,各位可以查看官方文檔,如有錯誤的地方請指出