美女圖片採集器 (源碼+解析),美女圖片採集器
前言:
有一段時間沒寫部落格了, "持之以恒"徽章都暗了, 實在不該。 前一段確實比較忙, ...小小地給自己的懶找個借口吧。 大二即將結束, 學習iOS也有一段時間了。今天抽點時間, 開源一個前幾天剛上傳的App裡面的一個功能, RT, 美女圖片採集器。 美女.. 相信沒有人不喜歡吧, 基於此, 這個小Demo應運而生。
注:
本文正在參加部落格大賽。 如果覺得對你有所協助, 還望幫忙投下票。 多謝。
投票連結: http://vote.blog.csdn.net/Article/Details?articleid=37825177 (投票按鈕在最下方)
效果示範:
看到這裡, 如果還有興趣學習的話, 可以先到我的git中下載源碼, 然後配合著源碼看我下面的解析。相信, 會讓你有所收穫的。
git下載連結: BeautyPickDemo.git
涉及內容:
源碼解析:
一。百度圖片API的使用首先, 我們知道百度是沒有對外開放圖片API的, 但是我們可以通過Google瀏覽器來捕捉到訪問過程中它調用的API。有興趣的, 可以瞭解下Google瀏覽器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格式資料解析一般的資料格式有
XML和
JSON, 這裡因為調用百度圖片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 (投票按鈕在最下方)
學習的路上, 與君共勉。
找個美女圖片站網站源碼最好帶資料
呵呵,上面這些人都是要錢購買的,我也是去買的,一套非常不錯的圖片網站源碼,但我能免費發給你!
美女圖片站網站源碼,高分換源碼
tube8