美女图片采集器 源码+解析
前言:
有一段时间没写博客了, "持之以恒"徽章都暗了, 实在不该。 前一段确实比较忙, ...小小地给自己的懒找个借口吧。 大二即将结束, 学习iOS也有一段时间了。今天抽点时间, 开源一个前几天刚上传的App里面的一个功能, RT, 美女图片采集器。 美女.. 相信没有人不喜欢吧, 基于此, 这个小Demo应运而生。
注:
本文正在参加博客大赛。 如果觉得对你有所帮助, 还望帮忙投下票。 多谢。
投票链接: http://vote.blog.csdn.net/Article/Details?articleid=37825177 (投票按钮在最下方)
效果演示:
看到这里, 如果还有兴趣学习的话, 可以先到我的git中下载源码, 然后配合着源码看我下面的解析。相信, 会让你有所收获的。
git下载链接: BeautyPickDemo.git
涉及内容:
- 百度图片API的使用
- JSON格式数据解析
- 图片异步下载 + 离线缓存
- 图片基本操作(缩放, 删除, 添加, 保存到本地)
- 下拉刷新, 上提加载
- 幻灯片放映
- 自定义后台显示图片
源码解析:
一。百度图片API的使用
说明:
返回格式为json
word为查询的内容
pn为第几页
rn为一页返回的图片数量
用法:大家在浏览器地址栏输入上述地址,回车即可看到返回的图片地址
http://image.baidu.com/channel/listjson?pn=0&rn=30&tag1=美女&tag2=全部&ftags=校花&ie=utf8
MobileCoreServices.framework
CFNetwork.framework
libz.dylib
@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];
二。JSON格式数据解析
#pragma mark - 加载数据完毕- (void)requestFinished:(ASIHTTPRequest *)request
我们只需要在这里解析数据, 使用数据即可。
//当以二进制读取返回内容时用这个方法 NSData *responseData = [request responseData]; NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
接下去就是神奇的时候了, 对于这样的一个字符串, 如果直接打印, 你可能会看得云里雾里的, json格式并且没有重新排列。
self.testDic = [responseString objectFromJSONString];
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];
三。图片异步下载+离线缓存
- (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]; }}
五。下拉刷新, 上提加载
六。幻灯片放映
_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键后显示后台程序时候, 该应用的显示效果。
本文正在参加博客大赛。 如果觉得对你有所帮助, 还望帮忙投下票。 多谢。
投票链接: http://vote.blog.csdn.net/Article/Details?articleid=37825177 (投票按钮在最下方)
再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow
美女图片采集器 源码+解析相关推荐
- 美女图片采集器 (源码+解析)
前言: 有一段时间没写博客了, "持之以恒"徽章都暗了, 实在不该. 前一段确实比较忙, ...小小地给自己的懒找个借口吧. 大二即将结束, 学习iOS也有一段时间了.今天抽点时间 ...
- 美女图片整站源码 wordpress主题多功能CX-UDY图片主题下载 带会员积分系统
这是一套带有CX-UDY图片主题的wordpress网站源码,页面设计美观大方,功能强大:会员积分系统+SEO优化+第三方登录+广告系统+代码自定义功能+支付系统- 下载链接: g美女图 ...
- 单文件图片管理php,PHP照片图片管理器源码,单文件PHP照片/图片文件管理源码FileManager...
PHP照片图片管理器源码,单文件PHP照片/图片文件管理源码FileManager. 如果你有NAS,想要远程管理自己的照片,那本文非常适合你.只有一个单文件PHP管理你自己的照片,还可以设置个性登录 ...
- SpringMVC拦截器源码解析
版权声明:本文为CSDN博主「风剑无影」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明. 原文链接:https://blog.csdn.net/dreamcatche ...
- SkeyePlayer RTSP/RTMP流媒体超低延迟播放器源码解析系列之H264一帧多NAL写MP4录像花屏问题解决方案
接上一篇[SkeyePlayer源码解析系列之录像写MP4]之续篇,我们来讲解一下关于H264编码格式中的一帧多nal(Network Abstract Layer, 即网络抽象层),关于H264和N ...
- 博客论坛自动采集器 - 蓝天采集器源码
介绍: 博客论坛自动采集器 做一个自动采集文章的网站,在你网站根目录创建一个目录随便我这边是caiji,然后把采集器的源码上传到caiji里面去. 安装:你的域名/caiji访问配置好数据库什么的安装 ...
- android 图片查看源码,Android 简单的图片查看器源码
public class MainActivity extends Activity { private EditText et_path; private ImageView iv; //创建han ...
- (仿)火车头采集器 源码开源
菜鸟作品,不喜勿喷 前两年自己花了很久想仿制一款火车头采集器 然后也付出了很多努力,最终未能修成正果 代码一直在电脑中吃灰,本着无私奉献的精神 免费开源,给有需要的人参考和完善 软件功能大部分都已实现 ...
- WordPress主题美女图片整站源码多功能CX-UDY图片主题(带会员积分系统)
源码下载地址:https://zy.prmath.com/252.html 这是一套带有CX-UDY图片主题的WordPress网站源码,页面设计美观大方,功能强大:会员积分系统+SEO优化+第三方登 ...
最新文章
- jetty9请求form表单太小限制
- koa中间件mysql写法_koa-mysql(三)
- bzoj2154: Crash的数字表格
- [我的1024开源程序]100元写的单词本说明书
- python 元类的call_python3 全栈开发 - 内置函数补充, 反射, 元类,__str__,__del__,exec,type,__call__方法...
- SQLite学习手册(锁和并发控制)
- POJ - 3257 Cow Roller Coaster (背包)
- 使用数据模板自定义数据显示
- SAP License:BW用户删除或禁用报错
- eve-ng:加载c7200 dynamips镜像
- 用粉红噪声煲机_白噪音|煲机白噪音粉红噪音mp3下载 - 121下载站
- Diamond软件的使用--(1)软件安装及配置
- 29-地理空间数据云下载【进阶】
- 一步一图一代码,一定要让你真正彻底明白红黑树
- ajax oracle数据库数据类型,ajax连接oracle数据库数据
- logstash grok mysql_logstash grok
- 线程控制-客户端获取信息无反应
- manjaro 中文输入法
- 使用计算机翻译功能吗,微信上怎么使用翻译功能 翻译功能设置教程
- 王爽《汇编语言》学习笔记
热门文章
- Hive中4个By Sort By 、Order By、Distrbute By、 Cluster By区别
- [NOIP模拟测试37]反思+题解
- imovie导入媒体没有声音的解决办法
- 滴滴出行小程序体积优化实践
- 多元线性回归模型的特征选择:全子集回归、逐步回归、交叉验证
- 基于RGB颜色空间使用OpenCV-Python实现照片换底
- 互联网日报 | 瑞幸咖啡同意支付1.8亿美元达成和解;国产游戏海外收入首破千亿;滴滴试水信用支付...
- Unity 接入Apple登录
- 致远OA自定义函数--正则表达式匹配校验
- Linux下wps文档结构图,wps文字的文档结构图