在ios8如下的系統建立新相冊,而後在相冊中手動刪除了這個"琳小兮"相冊,再使用下面的代碼從新建立"琳小兮"相冊是沒有問題的:
ios
[assetsLibrary addAssetsGroupAlbumWithName:@"琳小兮" resultBlock:^(ALAssetsGroup *group) { [groups addObject:group]; } failureBlock:nil];
ios8+ 包含ios8系統,若文件夾已被手動刪除,再建立同名文件夾的時候用上面的代碼則會崩潰,須要額外添加Photos.framework框架,並導入頭文件#import <Photos/Photos.h>,主要修改的代碼部分是把上面那段代碼作以下修改:數組
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^ { [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:@"琳小兮"]; } completionHandler:^(BOOL success, NSError *error) { if (!success) { NSLog(@"---error:%@",error.userInfo); } }];
下面是完整的demo,結合了網上的實例寫的,給你們作一個參考:框架
1.添加AssetsLibrary.framework 和 Photos.framework框架spa
2.導入頭文件code
#import <AssetsLibrary/AssetsLibrary.h>orm
#import <Photos/Photos.h>圖片
3.代碼以下:
ip
@interface ViewController ()<UIActionSheetDelegate> { NSMutableArray *imageArray; //存圖片的數組 int selectedImageIndex; //當前長按的下標 } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; imageArray = [[NSMutableArray alloc] initWithObjects:[UIImage imageNamed:@"1.png"],[UIImage imageNamed:@"2.png"],[UIImage imageNamed:@"3.png"],[UIImage imageNamed:@"4.png"], nil]; [self initImageView]; } #pragma mark - 建立UI -(void)initImageView { for (int i = 0; i < imageArray.count; i ++) { UIImageView * _imageV = [[UIImageView alloc] initWithFrame:CGRectMake(100, 50+110*i, 80, 80)]; _imageV.image = imageArray[i]; _imageV.userInteractionEnabled = YES; _imageV.tag = 100+i; [_imageV addGestureRecognizer:[[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress:)]]; [self.view addSubview:_imageV]; } } #pragma mark - 在手機相冊中建立新相冊 - (void)createAlbumInPhoneAlbum:(UIImage *)senderImage { ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init]; NSMutableArray *groups=[[NSMutableArray alloc]init]; ALAssetsLibraryGroupsEnumerationResultsBlock listGroupBlock = ^(ALAssetsGroup *group, BOOL *stop) { if (group) { [groups addObject:group]; } else { BOOL haveHDRGroup = NO; for (ALAssetsGroup *gp in groups) { NSString *name =[gp valueForProperty:ALAssetsGroupPropertyName]; if ([name isEqualToString:@"琳小兮"]) { haveHDRGroup = YES; } } if (!haveHDRGroup) { //添加一個新的相冊 //此方法在ios8.0系統上,以前用代碼建立的相冊,手動刪除它,再用這個庫去建立剛被刪除的相冊,這個時候方法回調是不會跑fail模塊的,它走的是正常流程,可是帶回來的group倒是nil // [assetsLibrary addAssetsGroupAlbumWithName:@"琳小兮" // resultBlock:^(ALAssetsGroup *group) // { // NSLog(@"--------%@",group); // [groups addObject:group]; // } // failureBlock:nil]; //爲了解決iOS8.0以上系統下沒法經過代碼建立被刪除過的同名相冊 [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^ { [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:@"琳小兮"]; } completionHandler:^(BOOL success, NSError *error) { if (!success) { NSLog(@"---error:%@",error.userInfo); } }]; haveHDRGroup = YES; } } }; [assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAlbum usingBlock:listGroupBlock failureBlock:nil]; [self saveToAlbumWithMetadata:nil imageData:UIImagePNGRepresentation(senderImage) customAlbumName:@"琳小兮" completionBlock:^ { //這裏能夠建立添加成功的方法 [self showAlert:@"圖片保存成功!"]; } failureBlock:^(NSError *error) { //添加失敗通常是由用戶不容許應用訪問相冊形成的,這邊能夠取出這種狀況加以判斷一下 if([error.localizedDescription rangeOfString:@"User denied access"].location != NSNotFound ||[error.localizedDescription rangeOfString:@"用戶拒絕訪問"].location!=NSNotFound){ [self showAlert:error.localizedFailureReason]; } }]; } #pragma mark 保存圖片 - (void)saveToAlbumWithMetadata:(NSDictionary *)metadata imageData:(NSData *)imageData customAlbumName:(NSString *)customAlbumName completionBlock:(void (^)(void))completionBlock failureBlock:(void (^)(NSError *error))failureBlock { ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init]; void (^AddAsset)(ALAssetsLibrary *, NSURL *) = ^(ALAssetsLibrary *assetsLibrary, NSURL *assetURL) { [assetsLibrary assetForURL:assetURL resultBlock:^(ALAsset *asset) { [assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) { if ([[group valueForProperty:ALAssetsGroupPropertyName] isEqualToString:customAlbumName]) { [group addAsset:asset]; if (completionBlock) { completionBlock(); } } } failureBlock:^(NSError *error) { if (failureBlock) { failureBlock(error); } }]; } failureBlock:^(NSError *error) { if (failureBlock) { failureBlock(error); } }]; }; [assetsLibrary writeImageDataToSavedPhotosAlbum:imageData metadata:metadata completionBlock:^(NSURL *assetURL, NSError *error) { if (customAlbumName) { [assetsLibrary addAssetsGroupAlbumWithName:customAlbumName resultBlock:^(ALAssetsGroup *group) { if (group) { [assetsLibrary assetForURL:assetURL resultBlock:^(ALAsset *asset) { [group addAsset:asset]; if (completionBlock) { completionBlock(); } } failureBlock:^(NSError *error) { if (failureBlock) { failureBlock(error); } }]; } else { AddAsset(assetsLibrary, assetURL); } } failureBlock:^(NSError *error) { AddAsset(assetsLibrary, assetURL); }]; } else { if (completionBlock) { completionBlock(); } } }]; } #pragma mark - 長按手勢 -(void)longPress:(UILongPressGestureRecognizer *)recognizer { //當長按手勢結束的時候觸發 if(recognizer.state == UIGestureRecognizerStateEnded) { UILongPressGestureRecognizer *tempLP = (UILongPressGestureRecognizer *)recognizer; //得到該手勢被添加到哪一個View UIImageView *imageV = (UIImageView *)tempLP.view; selectedImageIndex = (int)imageV.tag-100; NSLog(@"當前選中的是第%d張圖片",selectedImageIndex); UIActionSheet *menu = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:nil otherButtonTitles:@"保存到手機",nil]; menu.actionSheetStyle = UIActionSheetStyleBlackTranslucent; [menu showInView:self.view]; } } #pragma mark UIActionSheetDelegate - (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { switch (buttonIndex) { case 0: { [self createAlbumInPhoneAlbum:imageArray[selectedImageIndex]]; } break; default: break; } } #pragma mark encapsulationAlert -(void)showAlert:(NSString *)altString { UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"提示" message:altString delegate:nil cancelButtonTitle:@"肯定" otherButtonTitles: nil]; [alertView show]; }