相冊訪問權限數組
使用系統相冊的時候,首先判斷是否有權限,沒有權限的話,能夠彈出提示框。緩存
PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus]; if (status == PHAuthorizationStatusRestricted || status == PHAuthorizationStatusDenied) { // 這裏即是無訪問權限 //能夠彈出個提示框,叫用戶去設置打開相冊權限 } else { //這裏就是用權限 }
相冊中圖片變化的監聽異步
相冊監聽中的回調方法是在 子線程 中的,所以要改變UI佈局的話,必須回到主線程async
[[PHPhotoLibrary sharedPhotoLibrary] registerChangeObserver:self]; //建立監聽者 [[PHPhotoLibrary sharedPhotoLibrary] unregisterChangeObserver:self]; //移除監聽者 //相冊變化回調 - (void)photoLibraryDidChange:(PHChange *)changeInstance { dispatch_sync(dispatch_get_main_queue(), ^{ //修改UI }); }
獲取相冊中的圖片ide
幾個經常使用的類 PHAsset : 表明照片庫中的一個資源,跟 ALAsset 相似,經過 PHAsset 能夠獲取和保存資源。每一個PHAsset就是一張圖片的詳細信息,包括圖片、位置、時間等。佈局
PHFetchOptions : 獲取資源時的參數,能夠傳 nil,即便用系統默認值。fetch
PHFetchResult : 表示一系列的資源集合,也能夠是相冊的集合。spa
PHAssetCollection : 表示一個相冊或者一個時刻,或者是一個智能相冊(系統提供的特定的一系列相冊,例如:最近刪除,視頻列表,收藏等等)。線程
PHImageManager : 用於處理資源的加載,加載圖片的過程帶有緩存處理,能夠經過傳入一個 PHImageRequestOptions 控制資源的輸出尺寸等規格。code
PHImageRequestOptions : 如上面所說,控制加載圖片時的一系列參數。
// 獲取全部資源的集合,並按資源的建立時間排序 PHFetchOptions *options = [[PHFetchOptions alloc] init]; options.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES]]; //獲取相機膠捲全部圖片 PHFetchResult *assets = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeVideo options:nil]; PHImageRequestOptions *option = [[PHImageRequestOptions alloc] init]; //設置顯示模式 /* PHImageRequestOptionsResizeModeNone //選了這個就不會管傳如的size了 ,要本身控制圖片的大小,建議仍是選Fast PHImageRequestOptionsResizeModeFast //根據傳入的size,迅速加載大小相匹配(略大於或略小於)的圖像 PHImageRequestOptionsResizeModeExact //精確的加載與傳入size相匹配的圖像 */ option.resizeMode = PHImageRequestOptionsResizeModeFast; option.synchronous = NO; option.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat; CGFloat scale = [UIScreen mainScreen].scale; CGSize screenSize = [UIScreen mainScreen].bounds.size; typeof(self)weakSelf = self; for (PHAsset *asset in assets) { [[PHImageManager defaultManager] requestImageForAsset:asset targetSize:CGSizeMake(screenSize.width*scale, screenSize.height*scale) contentMode:PHImageContentModeAspectFit options:option resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) { //我這裏用個模型接儲存了圖片的 localIdentifier 和圖片自己 //還有不少信息,根據本身的需求來取 CellModel * model = [CellModel new]; model.localIdentifier = asset.localIdentifier; model.image = [UIImage imageWithData:UIImageJPEGRepresentation(result, 0.5)]; [weakSelf.cellImageArray addObject:model]; dispatch_async(dispatch_get_main_queue(), ^{ [weakSelf reloadData]; }); }]; }
將圖片保存到相冊
方法一: 優勢:簡單快捷 缺點:沒法直接保存到自定義相冊
- (IBAction)savePhoto { // - (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo; //只能保存到相機膠捲(不能保存到自定義相冊) UIImageWriteToSavedPhotosAlbum(self.Photo.image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil); } //回調判斷保存是否成功 - (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo { if (error) { //保存失敗 }else{ //保存成功 } }
方法二: 優勢:可以保存到任何相冊 缺點:沒有第一種方法簡單
// 添加圖片到本身相冊 - (void)savePhoto { [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ // 1.建立圖片請求類(建立系統相冊中新的圖片)PHAssetCreationRequest // 把圖片放在系統相冊 PHAssetCreationRequest *assetCreationRequest = [PHAssetCreationRequest creationRequestForAssetFromImage:_imageView.image]; // 2.建立相冊請求類(修改相冊)PHAssetCollectionChangeRequest PHAssetCollectionChangeRequest *assetCollectionChangeRequest = nil; // 獲取以前相冊 PHAssetCollection *assetCollection = [self fetchAssetCollection:@"百思不得姐"]; // 判斷是否已有相冊 if (assetCollection) { // 若是存在已有同名相冊 指定這個相冊,建立相冊請求修改類 assetCollectionChangeRequest = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:assetCollection]; } else { //不存在,建立新的相冊 assetCollectionChangeRequest = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:@"百思不得姐"]; } // 3.把圖片添加到相冊中 // NSFastEnumeration:之後只要看到這個,就能夠表示數組 //assetCreationRequest.placeholderForCreatedAsset 圖片請求類佔位符(至關於一個內存地址) //由於creationRequestForAssetFromImage方法是異步實行的,在這裏不能保證 assetCreationRequest有值 [assetCollectionChangeRequest addAssets:@[assetCreationRequest.placeholderForCreatedAsset]]; } completionHandler:^(BOOL success, NSError * _Nullable error) { if (success) { [SVProgressHUD showSuccessWithStatus:@"保存成功"]; } else { [SVProgressHUD showErrorWithStatus:@"保存失敗"]; } }]; } // 指定相冊名稱,獲取相冊 - (PHAssetCollection *)fetchAssetCollection:(NSString *)title { // 獲取相簿中全部自定義相冊 PHFetchResult *result = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil]; 遍歷相冊,判斷是否存在同名的相冊 for (PHAssetCollection *assetCollection in result) { if ([title isEqualToString:assetCollection.localizedTitle]) { 存在,就返回這個相冊 return assetCollection; } } return nil; }