基于SDWebImage實(shí)現(xiàn)的圖片瀏覽器

Demo 下載

一无牵、預(yù)覽

圖片瀏覽.gif

二漾肮、如何使用(使用簡(jiǎn)單)

    CLPhotoBrowser *brower = [[CLPhotoBrowser alloc] init];
    brower.photos = [NSMutableArray array];
    int i=0;
    for (UIImageView *imageView in self.images) {
        CLPhoto *photo = [[CLPhoto alloc] init];
        NSString *url = [_urls[i] stringByReplacingOccurrencesOfString:@"thumbnail" withString:@"bmiddle"];
        photo.url = url;
        photo.thumbUrl = _urls[i];
        photo.scrRect = [imageView convertRect:imageView.bounds toView:nil];
        [brower.photos addObject:photo];
        i++;
        
    }
    brower.selectImageIndex = tap.view.tag;
    [brower show];
    brower.delegate = self;
文件結(jié)構(gòu).png

三、庫(kù)結(jié)構(gòu)

CLPhotoBrowser:圖片瀏覽器的容器茎毁,顯示在window中的rootViewController
CLPhoto:保存圖片URL和其他數(shù)據(jù)的數(shù)據(jù)模型
PhotoBrowserCell:UICollectionViewCell的子類克懊,用于顯示圖片
CLPhotoProgressView:顯示圖片下載進(jìn)度的View

四、內(nèi)部實(shí)現(xiàn)

1、視圖顯示位置

- (void)show
{
    [[UIApplication sharedApplication].keyWindow endEditing:YES];

    UIViewController *rootViewCtl = [UIApplication sharedApplication].keyWindow.rootViewController;
    [rootViewCtl addChildViewController:self];
    [rootViewCtl.view addSubview:self.view];
    [self showFirstImageView];
}

2谭溉、顯示第一張圖片的動(dòng)畫

- (void)showFirstImageView
{
    CLPhoto *photo = [self.photos objectAtIndex:self.selectImageIndex];
    self.imageView = [[UIImageView alloc] init];
    [self.view addSubview:self.imageView];
    
    BOOL existBigPic = NO;
    self.imageView.image = [CLPhoto existImageWithUrl:photo.url];
    if (self.imageView.image) { //查看大圖是否存在
        existBigPic = YES;
    }else{//查看小圖是否存在
        self.imageView.image = [CLPhoto existImageWithUrl:photo.thumbUrl];
        if (self.imageView.image == nil) { //大小圖都不存在時(shí)
            self.imageView.image = [UIImage imageNamed:@"dialog_load"];
        }
    }
    
    //漸變顯示
    self.view.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.0];
    self.imageView.frame = photo.scrRect;
    __weak typeof(self)weakself = self;
    CGPoint ScreenCenter = self.view.window.center;

    [UIView animateWithDuration:duration animations:^{
        //有大圖直接顯示大圖墙懂,沒有先顯示小圖
        if (existBigPic) {
            CGSize size = [CLPhoto displaySize:self.imageView.image];
            weakself.imageView.frame = CGRectMake(0, 0, size.width, size.height);
            
            //長(zhǎng)圖處理
            if (size.height<=[UIScreen mainScreen].bounds.size.height) {
                weakself.imageView.center = ScreenCenter;
            }

        }else{
            self.imageView.center = self.view.center;
        }
        weakself.view.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:1.0];

        
    } completion:^(BOOL finished) {
        [weakself.imageView removeFromSuperview];

        weakself.imageView = nil;
        weakself.collectionView.contentOffset = CGPointMake(self.selectImageIndex*[UIScreen mainScreen].bounds.size.width, 0);
        weakself.pageCtl.numberOfPages = self.photos.count;
        weakself.pageCtl.currentPage = self.selectImageIndex;
        weakself.currentSelectIndex = self.selectImageIndex;
        [_collectionView setContentOffset:(CGPoint){weakself.currentSelectIndex * (self.view.bounds.size.width + 20),0} animated:NO];

    }];
}

3、點(diǎn)擊圖片隱藏圖片動(dòng)畫

- (void)hide:(UIImageView *)imageView with:(CLPhoto *)photo
{
    CGFloat width  = imageView.image.size.width;
    CGFloat height = imageView.image.size.height;
    
    CGSize tempRectSize = (CGSize){ScreenWidth,(height * ScreenWidth / width) > ScreenHeight ? ScreenHeight:(height * ScreenWidth / width)};
    
    [imageView setBounds:(CGRect){CGPointZero,{tempRectSize.width,tempRectSize.height}}];
    [imageView setCenter:self.view.center];
    [self.view addSubview:imageView];
    
    [UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{
        [imageView setFrame:photo.scrRect];
        self.view.backgroundColor = [UIColor clearColor];
    } completion:^(BOOL finished) {
        [self.view removeFromSuperview];
        [self removeFromParentViewController];
    }];
}

4扮念、給UIImageView添加手勢(shì)

- (UIImageView *)imageView
{
    if (_imageView == nil) {
        UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectZero];
        imageView.userInteractionEnabled = YES;

        
        // 1.生產(chǎn) 兩種 手勢(shì)
        UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(scrollViewDidTap)];
        UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(scrollViewDidDoubleTap:)];
        UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressToDo:)];
        
        // 2.設(shè)置 手勢(shì)的要求
        [tap setNumberOfTapsRequired:1];
        [tap setNumberOfTouchesRequired:1];
        [doubleTap setNumberOfTapsRequired:2];
        [doubleTap setNumberOfTouchesRequired:1];
        
        // 3.避免兩種手勢(shì)沖突
        [tap requireGestureRecognizerToFail:doubleTap];
        
        // 4.添加 手勢(shì)
        [self addGestureRecognizer:tap];
        [self addGestureRecognizer:doubleTap];
        [self addGestureRecognizer:longPress];
        
        
        [self.scrollview addSubview:imageView];
        _imageView = imageView;
        
    }
    return _imageView;
}

5损搬、圖片下載,先判斷圖片是否已經(jīng)下載

- (UIImage *)image
{

    UIImage *urlImage = [CLPhoto existImageWithUrl:self.url];
    if (urlImage) {
        if (self.progressBlock) {
            self.progressBlock(1);
        }
        CGSize size = [CLPhoto displaySize:urlImage];
        self.imageViewBounds = CGRectMake(0, 0, size.width, size.height);
        return urlImage;
    }else{
        
        __weak typeof(self)weakself = self;
        [[SDWebImageManager sharedManager] downloadImageWithURL:[NSURL URLWithString:self.url] options:SDWebImageRetryFailed progress:^(NSInteger receivedSize, NSInteger expectedSize) {
            if (weakself.progressBlock != nil) {

                CGFloat f = receivedSize*1.0 / expectedSize;
                weakself.progressBlock(f);
            }
        } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
            weakself.downLoad = YES;
        }];
        UIImage *thumbImage = [CLPhoto existImageWithUrl:self.thumbUrl];
        self.imageViewBounds = self.scrRect;
        return thumbImage;
    }

}

4扔亥、工具方法

(1)圖片在手機(jī)上面按比例顯示

+ (CGSize)displaySize:(UIImage *)image
{
    // 1.拿到圖片的寬高比
    CGFloat imageW = image.size.width;
    CGFloat ScreenW = [UIScreen mainScreen].bounds.size.width;
    CGFloat scale = image.size.height / imageW;
    // 2.根據(jù)寬高比計(jì)算高度
    CGFloat width =  0;
    //最小UIImageView的顯示寬度為100px
    if (imageW < 100) {
        width = 100;
    }else if (imageW > ScreenW) {
        width = ScreenW;
    }else{
        width = image.size.width;
    }
    CGFloat height =  width * scale;
    
    return CGSizeMake(width, height);
}

(2)判斷圖片是否在內(nèi)存中或者緩存到沙盒中

+ (UIImage *)existImageWithUrl:(NSString *)urlStr
{
    SDWebImageManager *manager = [SDWebImageManager sharedManager];
    UIImage *image = nil;
    NSURL *url = [NSURL URLWithString:urlStr];
    NSString *key = [manager cacheKeyForURL:url];
    image = [manager.imageCache imageFromMemoryCacheForKey:key]; //先看看內(nèi)存在是否存在圖片
    if (!image) {
        image = [manager.imageCache imageFromDiskCacheForKey:key]; //重緩存中取出改圖片
    }
    return image;
}

5场躯、 有bug歡迎指正

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市旅挤,隨后出現(xiàn)的幾起案子踢关,更是在濱河造成了極大的恐慌,老刑警劉巖粘茄,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件签舞,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡柒瓣,警方通過查閱死者的電腦和手機(jī)儒搭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)芙贫,“玉大人搂鲫,你說(shuō)我怎么就攤上這事』瞧剑” “怎么了魂仍?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)拣挪。 經(jīng)常有香客問我擦酌,道長(zhǎng),這世上最難降的妖魔是什么菠劝? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任赊舶,我火速辦了婚禮,結(jié)果婚禮上赶诊,老公的妹妹穿的比我還像新娘笼平。我一直安慰自己,他們只是感情好甫何,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布出吹。 她就那樣靜靜地躺著,像睡著了一般辙喂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天巍耗,我揣著相機(jī)與錄音秋麸,去河邊找鬼。 笑死炬太,一個(gè)胖子當(dāng)著我的面吹牛灸蟆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播亲族,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼炒考,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了霎迫?” 一聲冷哼從身側(cè)響起斋枢,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎知给,沒想到半個(gè)月后瓤帚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡涩赢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年戈次,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片筒扒。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡怯邪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出花墩,到底是詐尸還是另有隱情悬秉,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布观游,位于F島的核電站搂捧,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏懂缕。R本人自食惡果不足惜允跑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望搪柑。 院中可真熱鬧聋丝,春花似錦、人聲如沸工碾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)渊额。三九已至况木,卻和暖如春垒拢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背火惊。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工求类, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人屹耐。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓尸疆,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親惶岭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子寿弱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件按灶、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,058評(píng)論 4 62
  • 曾西翔閱讀 285評(píng)論 0 1
  • 畢業(yè)兩年多兆衅,一直在國(guó)企里工作地沮,從最開始的WEB開發(fā),到參與項(xiàng)目開發(fā)羡亩,到用戶調(diào)研專員摩疑,最后又回歸到項(xiàng)目管理,這當(dāng)中的...
    樸老師87閱讀 382評(píng)論 0 3
  • 前兩天看了一個(gè)故事畏铆,大概就是講一個(gè)女孩跟一個(gè)比她小的男孩在一起了雷袋,后來(lái)又分開了,后來(lái)這個(gè)男孩去世了的凄美愛情故事辞居。...
    蹊言閱讀 293評(píng)論 0 0