iOS开发——实用技术OC篇&关于自定义相册删除复活的实现

关于自定义相册删除复活的实现

在这里(http://www.cnblogs.com/iCocos/p/4705585.html)我们提到了。

  • 1:简单的实现了获取系统相册图片并且保存图片到系统相册
  • 2:定义自定义的相册,并且保存到自定义相册

这里久以一个简单的例子实现一个上面的所有功能,并且添加一个很有用的功能实现

  • App中自定义的相册呗删除之后再次保存相片无法成功

这里使用的是一个系统的库:ALAssetsLibrary

先来看看咱们取得相册中的相片

 1 - (void)getAllPhotos
 2 {
 3     ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
 4     // 遍历所有的文件夹, 一个ALAssetsGroup对象就代表一个文件夹
 5     [library enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
 6         // 遍历文件夹内的所有多媒体文件(图片、视频), 一个ALAsset对象就代表一张图片
 7         [group enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {
 8             // 缩略图
 9             XMGLog(@"%@", [UIImage imageWithCGImage:result.thumbnail]);
10             // 获得原始图片
11             //            XMGLog(@"%@", [UIImage imageWithCGImage:result.defaultRepresentation.fullResolutionImage]);
12         }];
13
14     } failureBlock:nil];
15 }

下面我们看看代码具体的实现

一:首先定义一个属性涌来记录并且实现其他一些功能

/** 相册库 */
@property (nonatomic, strong) ALAssetsLibrary *library;

二:然后就懒加载这个属性

1 - (ALAssetsLibrary *)library
2 {
3     if (!_library) {
4         _library = [[ALAssetsLibrary alloc] init];
5     }
6     return _library;
7 }
8  

三:点击保存按钮的实现

 1 - (IBAction)save
 2 {
 3     // 获得文件夹的名字
 4     __block NSString *groupName = [self groupName];
 5
 6     // self的弱引用
 7     XMGWeakSelf;
 8
 9     // 图片库
10     __weak ALAssetsLibrary *weakLibrary = self.library;
11
12     // 创建文件夹
13     [weakLibrary addAssetsGroupAlbumWithName:groupName resultBlock:^(ALAssetsGroup *group) {
14         if (group) { // 新创建的文件夹
15             // 添加图片到文件夹中
16             [weakSelf addImageToGroup:group];
17         } else { // 文件夹已经存在
18             [weakLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
19                 NSString *name = [group valueForProperty:ALAssetsGroupPropertyName];
20                 if ([name isEqualToString:groupName]) { // 是自己创建的文件夹
21                     // 添加图片到文件夹中
22                     [weakSelf addImageToGroup:group];
23
24                     *stop = YES; // 停止遍历
25                 } else if ([name isEqualToString:@"Camera Roll"]) {
26                     // 文件夹被用户强制删除了
27                     groupName = [groupName stringByAppendingString:@" "];
28                     // 存储新的名字
29                     [[NSUserDefaults standardUserDefaults] setObject:groupName forKey:XMGGroupNameKey];
30                     [[NSUserDefaults standardUserDefaults] synchronize];
31                     // 创建新的文件夹
32                     [weakLibrary addAssetsGroupAlbumWithName:groupName resultBlock:^(ALAssetsGroup *group) {
33                         // 添加图片到文件夹中
34                         [weakSelf addImageToGroup:group];
35                     } failureBlock:nil];
36                 }
37             } failureBlock:nil];
38         }
39     } failureBlock:nil];
40 }
41  

四:添加图片

 1 /**
 2  * 添加一张图片到某个文件夹中
 3  */
 4 - (void)addImageToGroup:(ALAssetsGroup *)group
 5 {
 6     __weak ALAssetsLibrary *weakLibrary = self.library;
 7     // 需要保存的图片
 8     CGImageRef image = self.imageView.image.CGImage;
 9
10     // 添加图片到【相机胶卷】
11     [weakLibrary writeImageToSavedPhotosAlbum:image metadata:nil completionBlock:^(NSURL *assetURL, NSError *error) {
12         [weakLibrary assetForURL:assetURL resultBlock:^(ALAsset *asset) {
13             // 添加一张图片到自定义的文件夹中
14             [group addAsset:asset];
15             [SVProgressHUD showSuccessWithStatus:@"保存成功!"];
16         } failureBlock:nil];
17     }];
18 }

五:关于沙河中的组名

先定义一个用于保存名字用的key和一个需要保存的名字

static NSString * const iCocosGroupNameKey = @"iCocosGroupNameKey";
static NSString * const iCocosDefaultGroupName = @"iCocos";

实现祖名的存取

 1 - (NSString *)groupName
 2 {
 3     // 先从沙盒中取得名字
 4     NSString *groupName = [[NSUserDefaults standardUserDefaults] stringForKey:XMGGroupNameKey];
 5     if (groupName == nil) { // 沙盒中没有存储任何文件夹的名字
 6         groupName = XMGDefaultGroupName;
 7
 8         // 存储名字到沙盒中
 9         [[NSUserDefaults standardUserDefaults] setObject:groupName forKey:XMGGroupNameKey];
10         [[NSUserDefaults standardUserDefaults] synchronize];
11     }
12
13     return groupName;
14 }
15  
时间: 2025-01-06 10:57:02

iOS开发——实用技术OC篇&关于自定义相册删除复活的实现的相关文章

iOS开发——实用技术OC篇&单例模式的实实现(ACR&MRC)

单例模式的实实现(ACR&MRC) 在iOS开发中单例模式是一种非常常见的模式,虽然我们自己实现的比较少,但是,系统却提供了不少的到来模式给我们用,比如最常见的UIApplication,Notification等, 那么这篇文章就简单介绍一下,我们开发中如果想要实现单例模式要怎么去实现! 单例模式顾名思义就是只有一个实例,它确保一个类只有一个实例,并且自行实例化并向整个系统提供这个实例.它经常用来做应用程序级别的共享资源控制.这个模式使用频率非常高,通过一个单例类,可以实现在不同窗口之间传递数

iOS开发——实用技术OC篇&多线程整合

多线程整合 本文知识对iOS开发中多线程的一些知识整合,关于一些概念和技术问题并没有过多的介绍,如果你想了解更多请查看笔者之前写的iOS开发之多线程详解(比较完整):但是有部分涉及到之前文章中没有的技术点和常识,比如加锁的方式,面试相关的,还有一些关于GCD的高级用法,希望你能认真看完,或许可以收获到很多! http://www.cnblogs.com/iCocos/p/4553103.html http://www.cnblogs.com/iCocos/p/4553262.html ??先来看

iOS开发——实用技术OC篇&UIWebView与JS的交互

UIWebView与JS的交互 事情的起因还是因为项目需求驱动.折腾了两天,由于之前没有UIWebView与JS交互的经历,并且觉得这次在功能上有一定的创造性,特此留下一点文字,方便日后回顾. 我要实现这样一个需求:按照本地的CSS文件展示一串网络获取的带HTML格式的只有body部分的文本,需要自己拼写完整的HTML.除此之外,还需要禁用获取的HTML文本中自带的 < img > 标签自动加载,并把下载图片的操作放在native端来处理,并通过JS将图片在Cache中的地址返回给UIWebv

iOS开发——实用技术OC篇&amp;?Invocation简单介绍

Invocation简单介绍 方法一:运行时方法:(这里在之前的文章定时器的几种方法中说过:www.cnblogs.com/iCocos/p/4694581.html) 1:创建一个签名: NSMethodSignature *singature = [NSMethodSignature signatureWithObjCTypes:"[email protected]:"]; 这里我想如果你仔细的话肯定注意到了:后面的“[email protected]:”,这里是运行时的语法在这里

iOS开发——实用技术OC篇&amp;8行代码教你搞定导航控制器全屏滑动返回效果

8行代码教你搞定导航控制器全屏滑动返回效果 前言 此次文章,讲述的是导航控制器全屏滑动返回效果,而且代码量非常少,10行内搞定. 效果如图: 如果喜欢我的文章,可以关注我,也可以来小码哥,了解下我们的iOS培训课程.陆续还会有更新ing.... 一.自定义导航控制器 目的:以后需要使用全屏滑动返回功能,就使用自己定义的导航控制器. 二.分析导航控制器侧滑功能 效果:导航控制器默认自带了侧滑功能,当用户在界面的左边滑动的时候,就会有侧滑功能. 系统自带的侧滑效果: 分析: 1.导航控制器的view

iOS开发——实用技术OC篇&amp;简单抽屉效果的实现

简单抽屉效果的实现 就目前大部分App来说基本上都有关于抽屉效果的实现,比如QQ/微信等.所以,今天我们就来简单的实现一下.当然如果你想你的效果更好或者是封装成一个到哪里都能用的工具类,那就还需要下一些功夫了,我们这里知识简单的介绍怎么去实现,不过一般我们开发都是找别人做好的,也没必要烂肺时间,除非你真的是大牛或者闲的蛋疼. 其实关于抽屉效果就是界面有三个View,其实一个主View其他两个分别是左边和右边的View,我们分别为他们添加手势,实现左右滑动显示对应的View. 一:所以,首先我们需

iOS开发——实用技术OC篇&amp;事件处理详解

事件处理详解 一:事件处理 事件处理常见属性: 事件类型 @property(nonatomic,readonly) UIEventType     type; @property(nonatomic,readonly) UIEventSubtype  subtype; 事件产生的时间 @property(nonatomic,readonly) NSTimeInterval  timestamp; 事件传递 - hitTest:withEvent: SWIFT func hitTest(_ po

iOS开发——实用技术OC篇&amp;CocoaPods简单粗暴

CocoaPods简单粗暴 直接上代码,不要问为什么,照着做就可以,我也是这么做的,具体的细节,请查看相关文档,网上太多! 1:移除ruby镜像 1 $ gem sources --remove https://rubygems.org/ 2:新增淘宝镜像 1 $ gem sources -a http://ruby.taobao.org/ 3:查看列表 1 $ gem sources -l 4:正式安装 1 sudo gem install cocoapods 接下来就是开始使用了. 查看对应

iOS开发——实用技术OC篇&amp;NSTimer使用注意点及总结

NSTimer使用注意点及总结 总结以下在NSTimer的使用中遇到的一些问题: 1. 不要在dealloc函数中停止并释放NSTimer 如果这样做,会导致对象永远无法调用dealloc函数,也就是会造成内存泄漏. 一个比较合理的解释是NSTimer的回调方法具有retain属性,所以不停止它的情况下被引用对象的retainCount无法降为0,导致内存泄漏的死循环 2.因为要实现类似视频软件里面,UIScrollview定时循环滑动,用到了NSTimer类.在特定时事件情况下需要暂停,和重新