前言:

有一段时间没写博客了, "持之以恒"徽章都暗了, 实在不该。 前一段确实比较忙, ...小小地给自己的懒找个借口吧。 大二即将结束, 学习iOS也有一段时间了。今天抽点时间, 开源一个前几天刚上传的App里面的一个功能, RT, 美女图片采集器。   美女.. 相信没有人不喜欢吧, 基于此, 这个小Demo应运而生。

注:

本文正在参加博客大赛。 如果觉得对你有所帮助, 还望帮忙投下票。 多谢。 

投票链接: http://vote.blog.csdn.net/Article/Details?articleid=37825177 (投票按钮在最下方)

效果演示:

 看到这里, 如果还有兴趣学习的话, 可以先到我的git中下载源码, 然后配合着源码看我下面的解析。相信, 会让你有所收获的。

 git下载链接: BeautyPickDemo.git

涉及内容:

  1. 百度图片API的使用
  2. JSON格式数据解析
  3. 图片异步下载 + 离线缓存
  4. 图片基本操作(缩放, 删除, 添加, 保存到本地)
  5. 下拉刷新, 上提加载
  6. 幻灯片放映
  7. 自定义后台显示图片

源码解析:

一。百度图片API的使用

首先, 我们知道百度是没有对外开放图片API的, 但是我们可以通过谷歌浏览器来捕捉到访问过程中它调用的API。有兴趣的, 可以了解下谷歌浏览器Network选项的使用, 也可以参考下这篇文章: 百度图片api
这里, 我们主要介绍如何使用即可。
1.百度图片通用API:
http://image.baidu.com/i?tn=resultjsonavstar&ie=utf-8&word=刘德华&pn=0&rn=60
说明:
返回格式为json
word为查询的内容
pn为第几页
rn为一页返回的图片数量
用法:大家在浏览器地址栏输入上述地址,回车即可看到返回的图片地址
2.百度图片分类API (我们使用的就是这个)
http://image.baidu.com/channel/listjson?pn=0&rn=30&tag1=美女&tag2=全部&ie=utf8
http://image.baidu.com/channel/listjson?pn=0&rn=30&tag1=美女&tag2=全部&ftags=校花&ie=utf8
至于其他的, 依照这个方法都能获取到. 就不重复说明了。
至于如何调用API, 涉及到网络编程。
开源的ASI类库做的比较好(虽然挺老的一个东西了, 也有一段时间没更新了, 但是能满足我们需求)。
从源码中, 可以找到 网络请求ASI文件夹,里面有需要的文件
1。导入这里的文件
2。导入必须的框架, 包括:
SystemConfiguration.framework
MobileCoreServices.framework
CFNetwork.framework
libz.dylib
3。调用API (参见 主界面-->picVC)
@property (nonatomic,strong) ASIHTTPRequest *testRequest;

NSString* urlString = [NSString stringWithFormat:@"http://image.baidu.com/channel/listjson?pn=%d&rn=10&tag1=美女&tag2=%@", nowPage, [chooseArr objectAtIndex:nowChoose]];urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];NSURL *url = [NSURL URLWithString:urlString];testRequest = [ASIHTTPRequest requestWithURL:url];[testRequest setDelegate:self];[testRequest startAsynchronous];

即可正常调用API。至于如何处理返回的数据, 下面再详细讲。

二。JSON格式数据解析

一般的数据格式有XMLJSON, 这里因为调用百度图片API返回的数据格式是JSON, 所以我们只要解析JSON即可。
调用API成功后, 它会自动执行这个函数

#pragma mark - 加载数据完毕- (void)requestFinished:(ASIHTTPRequest *)request

我们只需要在这里解析数据, 使用数据即可。

这个方法返回的数据是二进制格式的NSData, 我们需要手动转为UTF8编码。可以这样获取:
//当以二进制读取返回内容时用这个方法    NSData *responseData = [request responseData];    NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];

接下去就是神奇的时候了, 对于这样的一个字符串, 如果直接打印, 你可能会看得云里雾里的, json格式并且没有重新排列。

但是我们可以使用JsonKit来直接解析。(文件在json解析文件夹中)
只需这样一条语句即可:
self.testDic = [responseString objectFromJSONString];

打印解析后的数据如下:
至于需要哪些, 直接取就好了。比如. 我们这里需要获取到图片的标题. url, 宽度, 高度
NSMutableDictionary *nowDic = [[NSMutableDictionary alloc]init];[nowDic setObject:[[array objectAtIndex:i]objectForKey:@"image_url"] forKey:@"image_url"];[nowDic setObject:[[array objectAtIndex:i]objectForKey:@"image_width"] forKey:@"image_width"];[nowDic setObject:[[array objectAtIndex:i]objectForKey:@"image_height"] forKey:@"image_height"];[nowDic setObject:[[array objectAtIndex:i]objectForKey:@"desc"] forKey:@"desc"];[picArray addObject:nowDic];

三。图片异步下载+离线缓存

这里提一下SDWebImage, 我们将会使用它来实现。 具体使用参见:SDWebImage 笔记
在解析完json数据后, 我们会获取到图片对应的url。
我们可以通过访问url获取图片。 
- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder;

这是SDWebImage给我们提供的一个函数. 通过调用它, 我们可以实现异步下载和离线缓存。

使用方法:
UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(SPACE / 2 , SPACE / 2 , width, height)];NSURL *url = [NSURL URLWithString:imageInfo.thumbURL];[imageView setImageWithURL:url placeholderImage:nil];imageView.backgroundColor = [UIColor palePurpleColor];[self addSubview:imageView];

异步下载,离线缓存效果:(离线缓存可以到应用沙盒中查看)

四。图片基本操作(缩放, 删除, 添加, 保存到本地)

这里涉及的主要是一些常规操作, 包括缩放, 删除, 添加, 保存到本地等。
至于删除, 一般是长按删除, 只要在图片上加上长按手势响应即可。然后弹出一个对话框, 提示用户是否删除。确定删除后, 从沙盒中清除缓存即可。
添加手势方法:
//长按UILongPressGestureRecognizer *longRecognizer;longRecognizer = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(handleSingleLongFrom:)];[self addGestureRecognizer:longRecognizer];

从视图和沙盒中删除

        //从当前视图中删除        [testArr removeObject:data];        //刷新数据        __weak picVC *blockSelf = self;        [blockSelf.waterView refreshView:testArr];        [blockSelf.waterView.infiniteScrollingView stopAnimating];                //从沙盒中删除        //打开沙盒        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);        NSString *documentsDirectory = [paths objectAtIndex:0];        NSString * namePath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"savedPicInfo_%d.plist",nowChoose]];        NSMutableArray *picArray = [[NSMutableArray alloc] initWithContentsOfFile:namePath];                for (int i=0; i<[picArray count]; i++)        {            if ([[[picArray objectAtIndex:i]objectForKey:@"image_url"] isEqualToString:data.thumbURL])            {                [picArray removeObjectAtIndex:i];                break;            }        }        [picArray writeToFile:namePath atomically:YES];

至于缩放, 首先要弹出一个全屏显示的视图。

像这样:
//单击, 显示大图-(void)showImage:(ImageInfo*)data{    NSURL *url = [NSURL URLWithString:data.thumbURL];    [clickImage setImageWithURL:url placeholderImage:nil];    TGRImageViewController *viewController = [[TGRImageViewController alloc] initWithImage:clickImage.image setImageInfo:data];    viewController.transitioningDelegate = self;    [self presentViewController:viewController animated:YES completion:nil];}

本质就是调用presentViewController:viewController。

当然,我们可以给新视图的显示加上动画效果, 如下:
#pragma mark - UIViewControllerTransitioningDelegate methods- (id<UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source{    if ([presented isKindOfClass:TGRImageViewController.class]) {        return [[TGRImageZoomAnimationController alloc] initWithReferenceImageView:clickImage];    }    return nil;}- (id<UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed {    if ([dismissed isKindOfClass:TGRImageViewController.class]) {        return [[TGRImageZoomAnimationController alloc] initWithReferenceImageView:clickImage];    }    return nil;}

然后, 在新视图中, 添加点击移除, 长按弹出新操作, 双指移动缩放手势即可。
具体实现如下:
#pragma mark - Private methods- (void)longPress:(UITapGestureRecognizer *)tapGestureRecognizer{        if(tapGestureRecognizer.state == UIGestureRecognizerStateBegan)    {        [self popupActionSheet];    }}- (IBAction)handleSingleTap:(UITapGestureRecognizer *)tapGestureRecognizer {    [self dismissViewControllerAnimated:YES completion:nil];}- (IBAction)handleDoubleTap:(UITapGestureRecognizer *)tapGestureRecognizer {    if (self.scrollView.zoomScale == self.scrollView.minimumZoomScale) {        // Zoom in        CGPoint center = [tapGestureRecognizer locationInView:self.scrollView];        CGSize size = CGSizeMake(self.scrollView.bounds.size.width / self.scrollView.maximumZoomScale,                                 self.scrollView.bounds.size.height / self.scrollView.maximumZoomScale);        CGRect rect = CGRectMake(center.x - (size.width / 2.0), center.y - (size.height / 2.0), size.width, size.height);        [self.scrollView zoomToRect:rect animated:YES];    }    else {        // Zoom out        [self.scrollView zoomToRect:self.scrollView.bounds animated:YES];    }}

五。下拉刷新, 上提加载

这个功能具体在浏览图片的时候使用。 代码在picVC中。
但是因为我之前专门写过一篇这样的博客。 就不再重复了。
详细可以看这里: iOS开发-ios7下拉刷新,上提加载快速集成

六。幻灯片放映

顾名思义, 就是能够自动播放收藏过的美女图片..  
这里的原理是利用UIView的动画, 不断切换显示图片和显示效果。
切换效果如下:
    _transitionOptions= @[[NSNumber numberWithInteger:UIViewAnimationOptionTransitionFlipFromLeft],                          [NSNumber numberWithInteger:UIViewAnimationOptionTransitionFlipFromRight],                          [NSNumber numberWithInteger:UIViewAnimationOptionTransitionCurlUp],                          [NSNumber numberWithInteger:UIViewAnimationOptionTransitionCurlDown],                          [NSNumber numberWithInteger:UIViewAnimationOptionTransitionCrossDissolve],                          [NSNumber numberWithInteger:UIViewAnimationOptionTransitionFlipFromTop],                          [NSNumber numberWithInteger:UIViewAnimationCurveEaseIn],                          [NSNumber numberWithInteger:UIViewAnimationCurveEaseOut],                          [NSNumber numberWithInteger:UIViewAnimationCurveLinear],                          [NSNumber numberWithInteger:UIViewAnimationOptionAllowAnimatedContent],                          [NSNumber numberWithInteger:UIViewAnimationOptionOverrideInheritedCurve],                          [NSNumber numberWithInteger:UIViewAnimationOptionTransitionFlipFromTop],                          [NSNumber numberWithInteger:UIViewAnimationOptionTransitionFlipFromBottom]];

然后切换图片的时候, 实现如下代码即可。  (具体参见PhotoStackView)

-(void)reloadData {        if (!self.dataSource) {        //exit if data source has not been set up yet        self.photoViews = nil;        return;    }        NSInteger numberOfPhotos = [self.dataSource numberOfPhotosInPhotoStackView:self];    NSInteger topPhotoIndex  = [self indexOfTopPhoto]; // Keeping track of current photo's top index so that it remains on top if new photos are added        if(numberOfPhotos > 0) {        NSMutableArray *photoViewsMutable   = [[NSMutableArray alloc] initWithCapacity:numberOfPhotos];        UIImage *borderImage                = [self.borderImage resizableImageWithCapInsets:UIEdgeInsetsMake(self.borderWidth, self.borderWidth, self.borderWidth, self.borderWidth)];                for (NSUInteger index = 0; index < numberOfPhotos; index++) {            UIImage *image = [self.dataSource photoStackView:self photoForIndex:index];            CGSize imageSize = image.size;            if([self.dataSource respondsToSelector:@selector(photoStackView:photoSizeForIndex:)]){                imageSize = [self.dataSource photoStackView:self photoSizeForIndex:index];            }            UIImageView *photoImageView     = [[UIImageView alloc] initWithFrame:(CGRect){CGPointZero, imageSize}];            photoImageView.image            = image;            UIView *view                    = [[UIView alloc] initWithFrame:photoImageView.frame];            view.layer.rasterizationScale   = [[UIScreen mainScreen] scale];                        view.layer.shouldRasterize      = YES; // rasterize the view for faster drawing and smooth edges            if (self.showBorder) {                                // Add the background image                if (borderImage) {                    // If there is a border image, we need to add a background image view, and add some padding around the photo for the border                    CGRect photoFrame                = photoImageView.frame;                    photoFrame.origin                = CGPointMake(self.borderWidth, self.borderWidth);                    photoImageView.frame             = photoFrame;                    view.frame                       = CGRectMake(0, 0, photoImageView.frame.size.width+(self.borderWidth*2), photoImageView.frame.size.height+(self.borderWidth*2));                    UIImageView *backgroundImageView = [[UIImageView alloc] initWithFrame:view.frame];                    backgroundImageView.image        = borderImage;                                        [view addSubview:backgroundImageView];                } else {                    // if there is no boarder image draw one with the CALayer                    view.layer.borderWidth        = self.borderWidth;                    view.layer.borderColor        = [[UIColor whiteColor] CGColor];                    view.layer.shadowOffset       = CGSizeMake(0, 0);                    view.layer.shadowOpacity      = 0.5;                }            }            [view addSubview:photoImageView];            view.tag    = index;            view.center = CGPointMake(CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds));            [photoViewsMutable addObject:view];                    }        // Photo views are added to subview in the photoView setter        self.photoViews = photoViewsMutable; photoViewsMutable = nil;        [self goToPhotoAtIndex:topPhotoIndex];            }    }

七。自定义后台显示图片

这个功能就是演示效果里面, 当应用切换到后台后, 我们双击home键后显示后台程序时候, 该应用的显示效果。

比如..  有时候我们浏览的图片尺度比较大.. 然后切到后台的时候, 就希望把它隐藏起来..  
这就涉及到了Background Fetch的应用。
之前也写过一篇博客专门介绍。 这里就不重复了。
具体参见: iOS开发-自定义后台显示图片(iOS7-Background Fetch的应用)
好了。 到这里终于是介绍的差不多了。
当然。 我这里的解析都比较概括, 列举的都是几个关键代码段。
更加详细的还是需要自己去看代码。 注释也写了, 估计没什么问题。 如果有问题, 欢迎联系我。
一口气写了3个小时的博客...  累的够呛的。也希望, 能对你有所帮助。

本文正在参加博客大赛。 如果觉得对你有所帮助, 还望帮忙投下票。 多谢。 

投票链接: http://vote.blog.csdn.net/Article/Details?articleid=37825177 (投票按钮在最下方)

学习的路上, 与君共勉。

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

美女图片采集器 源码+解析相关推荐

  1. 美女图片采集器 (源码+解析)

    前言: 有一段时间没写博客了, "持之以恒"徽章都暗了, 实在不该. 前一段确实比较忙, ...小小地给自己的懒找个借口吧. 大二即将结束, 学习iOS也有一段时间了.今天抽点时间 ...

  2. 美女图片整站源码 wordpress主题多功能CX-UDY图片主题下载 带会员积分系统

    这是一套带有CX-UDY图片主题的wordpress网站源码,页面设计美观大方,功能强大:会员积分系统+SEO优化+第三方登录+广告系统+代码自定义功能+支付系统- 下载链接: g​​​​​​​美女图 ...

  3. 单文件图片管理php,PHP照片图片管理器源码,单文件PHP照片/图片文件管理源码FileManager...

    PHP照片图片管理器源码,单文件PHP照片/图片文件管理源码FileManager. 如果你有NAS,想要远程管理自己的照片,那本文非常适合你.只有一个单文件PHP管理你自己的照片,还可以设置个性登录 ...

  4. SpringMVC拦截器源码解析

    版权声明:本文为CSDN博主「风剑无影」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明. 原文链接:https://blog.csdn.net/dreamcatche ...

  5. SkeyePlayer RTSP/RTMP流媒体超低延迟播放器源码解析系列之H264一帧多NAL写MP4录像花屏问题解决方案

    接上一篇[SkeyePlayer源码解析系列之录像写MP4]之续篇,我们来讲解一下关于H264编码格式中的一帧多nal(Network Abstract Layer, 即网络抽象层),关于H264和N ...

  6. 博客论坛自动采集器 - 蓝天采集器源码

    介绍: 博客论坛自动采集器 做一个自动采集文章的网站,在你网站根目录创建一个目录随便我这边是caiji,然后把采集器的源码上传到caiji里面去. 安装:你的域名/caiji访问配置好数据库什么的安装 ...

  7. android 图片查看源码,Android 简单的图片查看器源码

    public class MainActivity extends Activity { private EditText et_path; private ImageView iv; //创建han ...

  8. (仿)火车头采集器 源码开源

    菜鸟作品,不喜勿喷 前两年自己花了很久想仿制一款火车头采集器 然后也付出了很多努力,最终未能修成正果 代码一直在电脑中吃灰,本着无私奉献的精神 免费开源,给有需要的人参考和完善 软件功能大部分都已实现 ...

  9. WordPress主题美女图片整站源码多功能CX-UDY图片主题(带会员积分系统)

    源码下载地址:https://zy.prmath.com/252.html 这是一套带有CX-UDY图片主题的WordPress网站源码,页面设计美观大方,功能强大:会员积分系统+SEO优化+第三方登 ...

最新文章

  1. jetty9请求form表单太小限制
  2. koa中间件mysql写法_koa-mysql(三)
  3. bzoj2154: Crash的数字表格
  4. [我的1024开源程序]100元写的单词本说明书
  5. python 元类的call_python3 全栈开发 - 内置函数补充, 反射, 元类,__str__,__del__,exec,type,__call__方法...
  6. SQLite学习手册(锁和并发控制)
  7. POJ - 3257 Cow Roller Coaster (背包)
  8. 使用数据模板自定义数据显示
  9. SAP License:BW用户删除或禁用报错
  10. eve-ng:加载c7200 dynamips镜像
  11. 用粉红噪声煲机_白噪音|煲机白噪音粉红噪音mp3下载 - 121下载站
  12. Diamond软件的使用--(1)软件安装及配置
  13. 29-地理空间数据云下载【进阶】
  14. 一步一图一代码,一定要让你真正彻底明白红黑树
  15. ajax oracle数据库数据类型,ajax连接oracle数据库数据
  16. logstash grok mysql_logstash grok
  17. 线程控制-客户端获取信息无反应
  18. manjaro 中文输入法
  19. 使用计算机翻译功能吗,微信上怎么使用翻译功能 翻译功能设置教程
  20. 王爽《汇编语言》学习笔记

热门文章

  1. Hive中4个By Sort By 、Order By、Distrbute By、 Cluster By区别
  2. [NOIP模拟测试37]反思+题解
  3. imovie导入媒体没有声音的解决办法
  4. 滴滴出行小程序体积优化实践
  5. 多元线性回归模型的特征选择:全子集回归、逐步回归、交叉验证
  6. 基于RGB颜色空间使用OpenCV-Python实现照片换底
  7. 互联网日报 | 瑞幸咖啡同意支付1.8亿美元达成和解;国产游戏海外收入首破千亿;滴滴试水信用支付...
  8. Unity 接入Apple登录
  9. 致远OA自定义函数--正则表达式匹配校验
  10. Linux下wps文档结构图,wps文字的文档结构图