iOS 保存图片到自定义相册

【iOS 保存图片到自定义相册】iOS 10开始,保存图片要获得隐私权限,要在info.plist添加一项key是Privacy - Photo Library Usage Description 要不然会报错
iOS 保存图片到自定义相册
文章图片

保存按钮点击事件

- (void)save { PHAuthorizationStatus oldStatus = [PHPhotoLibrary authorizationStatus]; // 请求\检查访问权限 : // 如果用户还没有做出选择,会自动弹框,用户对弹框做出选择后,才会调用block // 如果之前已经做过选择,会直接执行block [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) { dispatch_async(dispatch_get_main_queue(), ^{ if (status == PHAuthorizationStatusDenied) { // 用户拒绝当前App访问相册 if (oldStatus != PHAuthorizationStatusNotDetermined) { DLog(@"提醒用户打开开关"); } } else if (status == PHAuthorizationStatusAuthorized) { // 用户允许当前App访问相册 [self saveImageIntoAlbum]; } else if (status == PHAuthorizationStatusRestricted) { // 无法访问相册 [SVProgressHUD showErrorWithStatus:@"因系统原因,无法访问相册!"]; } }); }]; }

#pragma mark - 保存图片到自定义相册 - (void)saveImageIntoAlbum { // 获得相片 PHFetchResult *createdAssets = self.createdAssets; if (createdAssets == nil) { [SVProgressHUD showErrorWithStatus:@"保存图片失败!"]; return; }// 获得相册 PHAssetCollection *createdCollection = self.createdCollection; if (createdCollection == nil) { [SVProgressHUD showErrorWithStatus:@"创建或者获取相册失败!"]; return; }// 添加刚才保存的图片到【自定义相册】 NSError *error = nil; [[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{ PHAssetCollectionChangeRequest *request = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:createdCollection]; [request insertAssets:createdAssets atIndexes:[NSIndexSet indexSetWithIndex:0]]; } error:&error]; // 最后的判断 if (error) { [SVProgressHUD showErrorWithStatus:@"保存图片失败!"]; } else { [SVProgressHUD showSuccessWithStatus:@"保存图片成功!"]; } } #pragma mark - 获得当前App对应的自定义相册 - (PHAssetCollection *)createdCollection { // 获得APP名字 NSString *title = [NSBundle mainBundle].infoDictionary[(__bridge NSString *)kCFBundleNameKey]; // 抓取所有的自定义相册 PHFetchResult *collections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil]; // 查找当前App对应的自定义相册 for (PHAssetCollection *collection in collections) { if ([collection.localizedTitle isEqualToString:title]) { return collection; } }/** 当前App对应的自定义相册没有被创建过 **/ // 创建一个【自定义相册】 NSError *error = nil; __block NSString *createdCollectionID = nil; [[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{ createdCollectionID = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:title].placeholderForCreatedAssetCollection.localIdentifier; } error:&error]; if (error) return nil; // 根据唯一标识获得刚才创建的相册 return [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[createdCollectionID] options:nil].firstObject; } #pragma mark - 获得相片 - (PHFetchResult *)createdAssets { NSError *error = nil; __block NSString *assetID = nil; // 保存图片到【相机胶卷】 [[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{ assetID = [PHAssetChangeRequest creationRequestForAssetFromImage:self.imageView.image].placeholderForCreatedAsset.localIdentifier; } error:&error]; if (error) return nil; // 获取刚才保存的相片 return [PHAsset fetchAssetsWithLocalIdentifiers:@[assetID] options:nil]; }

如果只是保存到系统相册
C语言函数UIImageWriteToSavedPhotosAlbum 一个函数搞定注意: // Adds a photo to the saved photos album.The optional completionSelector should have the form: 意思就是要实现下面格式的方法,要不然会报错 //- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo;

    推荐阅读