美女圖片採集器 (源碼+解析),美女圖片採集器

來源:互聯網
上載者:User

美女圖片採集器 (源碼+解析),美女圖片採集器
前言:


有一段時間沒寫部落格了, "持之以恒"徽章都暗了, 實在不該。 前一段確實比較忙, ...小小地給自己的懶找個借口吧。 大二即將結束, 學習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格式資料解析一般的資料格式有 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 (投票按鈕在最下方)



學習的路上, 與君共勉。


找個美女圖片站網站源碼最好帶資料

呵呵,上面這些人都是要錢購買的,我也是去買的,一套非常不錯的圖片網站源碼,但我能免費發給你!
 
美女圖片站網站源碼,高分換源碼

tube8
 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.