iOS9中将图片保存到照片中的某个相册的方法说明
2016-01-14 17:25
525 查看
iOS9中将图片保存到照片中的某个相册的方法说明
在App中很经常遇到的就是用户点击某张图片后将图片保存到本地,下面介绍下iOS中保存图片的一些东西1.首先,在iOS中把图片保存到系统照片是比较简单的,具体实现用下面的语句即可
- (IBAction)save:(id)sender { // 存储图片到"相机胶卷" UIImageWriteToSavedPhotosAlbum(self.imageView.image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil); } // 成功保存图片到相册中, 必须调用此方法, 否则会报参数越界错误 - (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo{ }
2.在iOS9之前我们也可以使用Assets Library Framework保存图片
第一步:添加 AssetsLibrary.framework 框架第二步:需要使用的类里面导入头文件 #import
第三步:保存网络图片到本地
- (void)viewDidLoad { [super viewDidLoad]; UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://pic25.nipic.com/20121209/9252150_194258033000_2.jpg"]]]; [self saveImage:image]; } - (void)saveImage:(UIImage*)image { ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; [library writeImageToSavedPhotosAlbum:[image CGImage] orientation:(ALAssetOrientation)image.imageOrientation completionBlock:^(NSURL *assetURL, NSError *error) { if (error) { NSLog(@"Save image fail:%@",error); }else{ NSLog(@"Save image succeed."); } }]; }
3.但是在iOS9中apple废弃了上面的框架,并推荐用Photos Framework框架
也是需要先添加Photos.framework后导入#import <Photos/Photos.h>
Photos.framework框架非常强大,不止图片,自拍、全景、iOS9中新增的Live Photo、甚至视频等等,框架都有详细的划分和功能设置
在这里我要实现的是第一种方法实现不了的功能,那就是建一个属于这个App的相簿,这个功能确实会经常遇到,代码如下,有详细注释:
- (void)saveImage { //保存图片 __block NSString *assetId = nil; // 1. 存储图片到"相机胶卷" [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ // 新建一个PHAssetCreationRequest对象 // 返回PHAsset(图片)的字符串标识 assetId = [PHAssetCreationRequest creationRequestForAssetFromImage:self.imageView.image].placeholderForCreatedAsset.localIdentifier; } completionHandler:^(BOOL success, NSError * _Nullable error) { // 2. 获得相册对象 PHAssetCollection *collection = [self getCollection]; // 3. 将“相机胶卷”中的图片添加到新的相册 [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ PHAssetCollectionChangeRequest *request = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:collection]; NSLog(@"%@", [PHAsset fetchAssetsWithLocalIdentifiers:@[assetId] options:nil]); // 根据唯一标示获得相片对象 PHAsset *asset = [PHAsset fetchAssetsWithLocalIdentifiers:@[assetId] options:nil].firstObject; // 添加图片到相册中 [request addAssets:@[asset]]; } completionHandler:^(BOOL success, NSError * _Nullable error) { NSLog(@"成功保存到相簿:%@", collection.localizedTitle); }]; }]; } - (PHAssetCollection *)getCollection { // 先获得之前创建过的相册 PHFetchResult<PHAssetCollection *> *collectionResult = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil]; for (PHAssetCollection *collection in collectionResult) { if ([collection.localizedTitle isEqualToString:@"知乎日报"]) { return collection; } } // 如果相册不存在,就创建新的相册(文件夹) __block NSString *collectionId = nil; // __block修改block外部的变量的值 // 这个方法会在相册创建完毕后才会返回 [[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{ // 新建一个PHAssertCollectionChangeRequest对象, 用来创建一个新的相册 collectionId = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:@"知乎日报"].placeholderForCreatedAssetCollection.localIdentifier; } error:nil]; return [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[collectionId] options:nil].firstObject; }
最后的话
Photos.framework框架确实非常强大,但在阅读Apple官方文档后,在使用时真的非常麻烦,在我看来,这个框架类似于Core Data,你的每一次操作都必须建立自己的Request,并在内存中建一个中间相簿进行缓冲,并且所有操作,系统都是在后台完成。
另外要注意的一点是:completionHandler:返回的闭包中不要进行前台视图的刷新操作!!!这是Apple文档中明确提到的。
相关文章推荐
- iostat--磁盘IO性能监控
- ffmpeg编译for IOS
- iOS 自定义库文件
- 【iOS开发】XML解析--GData语法
- IOS中UserDefaults的用法
- iOS -- LaunchScreen欢迎界面动画效果
- ios 获取相机权限 判断相机状态
- iOS开发-图片高斯模糊效果
- Ios中时间无法响应
- iOS代码实现常用控件之Slider 文字缩放
- iOS开发之自定义封装FrameWork需要的代码
- 我与cocoapods三五事儿,至我那终将逝去的灵魂
- iOS学习路线图
- ios 栈区,堆区
- ios Coredata 的 rollback undo 等事物处理函数
- [iOS]推送相关两点
- iOS开发Transform
- [iOS]推送相关两点
- IOS应用开发中的设备标识
- 环信iOS 简单集成3.0实时通话