前言:
有一段時間沒寫博客了, "持之以恆"徽章都暗了, 實在不該。 前一段確實比較忙, ...小小地給自己的懶找個借口吧。
大二即將結束, 學習iOS也有一段時間了。今天抽點時間, 開源一個前幾天剛上傳的App里面的一個功能, RT, 美女圖片採集器。 美女.. 相信沒有人不喜歡吧, 基於此, 這個小Demo應運而生。
注:
本文正在參加博客大賽。 假設認為對你有所幫助, 還望幫忙投下票。 多謝。
投票鏈接: http://vote.blog.csdn.net/Article/Details?articleid=37825177 (投票button在最下方)
效果演示:
看到這里, 假設還有興趣學習的話, 能夠先到我的git中下載源代碼, 然后配合着源代碼看我以下的解析。相信, 會讓你有所收獲的。
git下載鏈接: BeautyPickDemo.git
涉及內容:
- 百度圖片API的使用
- JSON格式數據解析
- 圖片異步下載 + 離線緩存
- 圖片基本操作(縮放, 刪除, 加入, 保存到本地)
- 下拉刷新, 上提載入
- 幻燈片放映
- 自己定義后台顯示圖片
源代碼解析:
一。百度圖片API的使用
tn=resultjsonavstar&ie=utf-8&word=劉德華&pn=0&rn=60
說明:
返回格式為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];
三。圖片異步下載+離線緩存
詳細使用參見:SDWebImage 筆記
- (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 (投票button在最下方)