iOS8.0圖片PhotoKit筆記

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倍就夠了,再大的話內存不夠容易崩潰

PHCachingImageManagerPHImageManager的子類,該類加載圖片時使用了緩存機制,也可是使用該方法提前緩存圖片

:如果使用上述代碼加載的話,返回圖片尺寸並不是你想要的尺寸,這是因爲沒有設置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) {

}];

小結:這裏只是介紹了我項目中需要用到的東西,應該能滿足大部分需要,當然還有好多保存圖片之類的功能沒有介紹,各位可以查看官方文檔,如有錯誤的地方請指出

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章