iOS開發(fā):接入閃萌動(dòng)圖(仿qq效果)并支持webp動(dòng)圖解析

目標(biāo)

1、接入閃萌動(dòng)圖
2肤无、仿qq動(dòng)圖效果
3的诵、支持webp

demo鏈接

https://github.com/pengwj/blogWork/tree/master/code/ShanMengTest

接入閃萌api

閃萌的api需要在他們官網(wǎng)http://www.weshineapp.com缆瓣,找客服領(lǐng)取測(cè)試用的id、密鑰诗鸭。

仿qq動(dòng)圖效果

主要布局采用UICollectionView,大家可以看我demo的實(shí)現(xiàn)参滴,我項(xiàng)目中是在輸入框文字變換的回調(diào)中刷新請(qǐng)求接口的强岸。另外就是需要10秒鐘不操作,彈窗自動(dòng)收回砾赔。

//添加定時(shí)器
- (void)refreshTimer
{
    _timerValue = 0;

    if (!_timer) {
        _timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerDown) userInfo:nil repeats:YES];
        [[NSRunLoop currentRunLoop] addTimer:_timer forMode:NSRunLoopCommonModes];
    }
}

//執(zhí)行任務(wù)
- (void)timerDown
{
    self.timerValue++;
    if (self.timerValue >= 10) {
        [self hideSelf];
    }
}

//定時(shí)器的停止
- (void)finishedTimer
{
    self.timerValue = 0;
    
    [self.timer invalidate];
    self.timer = nil;
}

#pragma mark - UIScrollViewDelegate
- ( void)scrollViewDidScroll:( UIScrollView *)scrollView
{
    // 重新開始計(jì)時(shí)
    [self refreshTimer];
}

支持webp

這個(gè)是臨時(shí)加進(jìn)來(lái)的需求蝌箍,開始我想著應(yīng)該很簡(jiǎn)單,結(jié)果沒(méi)想到還蠻坑的暴心。

webp是谷歌在2010年推出的新一代圖片格式十绑,在壓縮方面比當(dāng)前JPEG格式更優(yōu)越,在質(zhì)量相同的情況下酷勺,WebP格式圖像的體積要比JPEG格式圖像小40%本橙。

支持webp的顯示

下面兩個(gè)方案我都實(shí)現(xiàn)過(guò),其中方案1操作起來(lái)更簡(jiǎn)單一些(demo中選擇的也是這個(gè)方案)脆诉,但是由于項(xiàng)目中的SDWebImage版本低于3.0.0甚亭,所以只好選擇了修改SD的庫(kù)贷币,也就是方案2。

方案1

使用SDWebImageWebPCoder+SDWebImage即可實(shí)現(xiàn)webp的動(dòng)圖+靜態(tài)圖加載亏狰。但這個(gè)方案比較蛋疼的是SDWebImageWebPCoder比較依賴SDWebImage的實(shí)現(xiàn)役纹,中間引用了一大堆SDWebImage的方法,完全沒(méi)辦法獨(dú)立使用暇唾,如果SD用的老版本促脉,那這個(gè)方案基本可以放棄了。

添加pod

pod 'SDWebImageWebPCoder'
pod 'SDWebImage', '~> 5.0'

然后執(zhí)行pod install
但是庫(kù)去要去拉取谷歌的libwebp文件會(huì)失敗策州,所以需要我們進(jìn)行還原操作瘸味。具體操作如下。

操作步驟:

此操作步驟來(lái)自于iOSCoder_XH够挂,下面復(fù)制一下主要是為了備份旁仿。
1、 查看 mac 中 cocoapods 本地庫(kù)路徑:
pod repo
2孽糖、在本地庫(kù)中, 并找到對(duì)應(yīng)的 libwebp 版本的文件
find ~/.cocoapods/repos/master -iname libwebp
3枯冈、打開上一步查找的路徑
open /Users/xxxxxxx/.cocoapods/repos/master/Specs/1/9/2/libwebp
4、在文件下找到之前pod install失敗的libwebp版本文件夾
5办悟、打開文件libwebp.podspec.json尘奏,修改git的地址
"source": {
"git": "https://chromium.googlesource.com/webm/libwebp",
"tag": "v1.0.2"
},
改為
"source": {
"git": "https://github.com/webmproject/libwebp.git",
"tag": "v1.0.2"
},
保存
6、重新pod install

使用方法

這里單獨(dú)拎出來(lái)主要是感覺(jué)這個(gè)庫(kù)的使用有點(diǎn)怪病蛉,官網(wǎng)例子也寫的不太清楚罪既。
在你需要展示webp文件的位置,添加coder

// Add coder
SDImageWebPCoder *webPCoder = [SDImageWebPCoder sharedCoder];
[[SDImageCodersManager sharedManager] addCoder:webPCoder];

然后再使用SD加載圖片的方法即可支持webp圖片的播放铡恕。

UIImageView *imageView;
NSURL *webpURL;
[imageView sd_setImageWithURL:webpURL];

是不是很清爽琢感,這里也支持一下SDWebImageWebPCoder,開發(fā)者好像還是一個(gè)國(guó)內(nèi)的小伙伴探熔,感謝他們的無(wú)私奉獻(xiàn)驹针。

方案2

如果項(xiàng)目中SDWbImage的版本比較舊的時(shí)候,可以考慮一下方案2诀艰。方案2主要是修改了SDWebImage解析WebP數(shù)據(jù)的方法sd_imageWithWebPData柬甥,然后用YYImage去解析數(shù)據(jù),解析后通過(guò)SD的方法返回其垄。

開啟SDWebImage的WebP參數(shù)

Build Settings中搜索Preprocessor Macros苛蒲,添加"SD_WEBP=1",添加這個(gè)參數(shù)后,SDWebImage才會(huì)執(zhí)行webp相關(guān)解析代碼绿满。

添加YYImage

pod 'YYImage'

然后執(zhí)行pod install

修改SDWebImage的sd_imageWithWebPData方法

// 添加YYImage頭文件
#import <YYImage/YYImage.h>

修改sd_imageWithWebPData方法如下

+ (UIImage *)sd_imageWithWebPData:(NSData *)data {

    YYImage *image = [[YYImage alloc] initWithData:data scale:0];
    
    return image;
}

修改SDWebImage的SDScaledImageForKey方法

該方法在SDWebImageCompat.m文件中臂外。
之所以修改這里,是因?yàn)镾DWebImage會(huì)在這里對(duì)圖片進(jìn)行繪制處理,主要是為了適配不同的屏幕scale漏健。所以我們需要在這里直接返回一下嚎货。
【注意??????:不同的SD版本修改的方法可能不同,需要大家自己看項(xiàng)目中SD源碼】

inline UIImage *SDScaledImageForKey(NSString *key, UIImage *image) {
    if (!image) {
        return nil;
    }
    
// 添加的代碼如下(判斷是YYImage直接返回)
    if ([image isKindOfClass:NSClassFromString(@"YYImage")]) {
        return image;
    }
//  添加的代碼如上   

    if ([image.images count] > 0) {
        NSMutableArray *scaledImages = [NSMutableArray array];

        for (UIImage *tempImage in image.images) {
            [scaledImages addObject:SDScaledImageForKey(key, tempImage)];
        }

        return [UIImage animatedImageWithImages:scaledImages duration:image.duration];
    }
    else {
        if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
            CGFloat scale = 1.0;
            if (key.length >= 8) {
                // Search @2x. or @3x. at the end of the string, before a 3 to 4 extension length (only if key len is 8 or more @2x./@3x. + 4 len ext)
                NSRange range = [key rangeOfString:@"@2x." options:0 range:NSMakeRange(key.length - 8, 5)];
                if (range.location != NSNotFound) {
                    scale = 2.0;
                }
                
                range = [key rangeOfString:@"@3x." options:0 range:NSMakeRange(key.length - 8, 5)];
                if (range.location != NSNotFound) {
                    scale = 3.0;
                }
            }

            UIImage *scaledImage = [[UIImage alloc] initWithCGImage:image.CGImage scale:scale orientation:image.imageOrientation];
            image = scaledImage;
        }
        return image;
    }
}

使用如下

主要是需要替換UIImageViewYYAnimatedImageView蔫浆,其他的正常使用即可殖属。

// 引入YYAnimatedImageView.h頭文件
#import <YYImage/YYAnimatedImageView.h>

// 初始化YYAnimatedImageView
@property (nonatomic, strong) YYAnimatedImageView *gifImageView;
    NSURL *url  = [NSURL URLWithString:@"閃萌動(dòng)圖webp地址"];
    [self.gifImageView sd_setImageWithURL:url completed:nil];

將webp轉(zhuǎn)換成gif并保存到本地

核心代碼如下:

        YYImageDecoder *decoder = [YYImageDecoder decoderWithData:self.gifImageView.animatedImageData scale:0];
        NSData *gifData = [YYImageEncoder encodeImageWithDecoder:decoder type:YYImageTypeGIF quality:1];

使用YYImageDecoder先解壓webp圖片,然后用YYImageEncoderencodeImageWithDecoder方法將webp格式的動(dòng)圖轉(zhuǎn)換成gif格式的Data瓦盛,然后保存到相冊(cè)中洗显。

全部代碼如下:

        
        YYImageDecoder *decoder = [YYImageDecoder decoderWithData:self.emojiImage.animatedImageData scale:0];
        NSData *gifData = [YYImageEncoder encodeImageWithDecoder:decoder type:YYImageTypeGIF quality:1];
        [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
            [[PHAssetCreationRequest creationRequestForAsset] addResourceWithType:PHAssetResourceTypePhoto data:gifData options:nil];
        } completionHandler:^(BOOL success, NSError * _Nullable error) {
            dispatch_async(dispatch_get_main_queue(), ^{
                
                if(success && !error){
                    [SVProgressHUD showSuccessWithStatus:@"保存動(dòng)圖成功"];
                }else
                    [SVProgressHUD showErrorWithStatus:@"保存動(dòng)圖失敗,請(qǐng)重試"];
            });
            
        }];
        
    });

總結(jié)

遇到各個(gè)博客沒(méi)有比較成熟的解決方案時(shí),記得優(yōu)先看開源庫(kù)原环、系統(tǒng)庫(kù)的相關(guān)頭文件挠唆。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市扮念,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌碧库,老刑警劉巖柜与,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異嵌灰,居然都是意外死亡弄匕,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門沽瞭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)迁匠,“玉大人,你說(shuō)我怎么就攤上這事驹溃〕巧ィ” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵豌鹤,是天一觀的道長(zhǎng)亡哄。 經(jīng)常有香客問(wèn)我,道長(zhǎng)布疙,這世上最難降的妖魔是什么蚊惯? 我笑而不...
    開封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮灵临,結(jié)果婚禮上截型,老公的妹妹穿的比我還像新娘。我一直安慰自己儒溉,他們只是感情好宦焦,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般赶诊。 火紅的嫁衣襯著肌膚如雪笼平。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天舔痪,我揣著相機(jī)與錄音寓调,去河邊找鬼。 笑死锄码,一個(gè)胖子當(dāng)著我的面吹牛夺英,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播滋捶,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼痛悯,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了重窟?” 一聲冷哼從身側(cè)響起载萌,我...
    開封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎巡扇,沒(méi)想到半個(gè)月后扭仁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡厅翔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年乖坠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刀闷。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡熊泵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出甸昏,到底是詐尸還是另有隱情顽分,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布施蜜,位于F島的核電站怯邪,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏花墩。R本人自食惡果不足惜悬秉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望冰蘑。 院中可真熱鬧和泌,春花似錦、人聲如沸祠肥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至县恕,卻和暖如春东羹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背忠烛。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工属提, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人美尸。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓冤议,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親师坎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子恕酸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

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