前言:
鑒于最近業(yè)內(nèi)bug數(shù)量的急劇減少装悲,遂決定寫(xiě)點(diǎn)什么。
概述:
iphone相冊(cè)不支持gif瀏覽,雖然相冊(cè)中的gif是靜止圖但是保存的是gif格式和敬。
這里大概講下我的思路:
- 1.先通過(guò)assetslibrary取得gif圖片的data格式,然后保存到本地文件夾中(因?yàn)樵?ALAssetsLibraryAssetForURLResultBlock外取的值為空戏阅,我用_ _block也不行昼弟,有其他方案的歡迎指教),然后當(dāng)從相冊(cè)取到圖片并返回到你的控制器的時(shí)候(相冊(cè)代理中的[self dismissViewControllerAnimated:YES completion:^() { }中)奕筐,取得你保存在本地的imgData舱痘。
- 2.加載gif的思路有兩種,一種是通過(guò)幀動(dòng)畫(huà)加載离赫,另一種通過(guò)webView加載芭逝。本文是通過(guò)webView加載。將剛?cè)〉玫膇mgData通過(guò)webView加載并顯示出來(lái)渊胸。
- 3.webView中圖片過(guò)大問(wèn)題處理旬盯。設(shè)置web屬性頁(yè)面自適應(yīng),禁止?jié)L動(dòng)翎猛;并在web加載完成代理中胖翰,控制web的contentSize;
_webView.scalesPageToFit = YES;
_webView.scrollView.scrollEnabled = NO; - 4.最后办成,在appDelegate中泡态,設(shè)置程序打開(kāi)及退出時(shí),刪除本地保存的圖片迂卢。
通過(guò)assetslibrary 框架獲取相冊(cè)中g(shù)if圖片(注意獲取gif圖片需要將其轉(zhuǎn)換為data某弦,直接獲取圖片是第一幀的靜止圖片。)
-(void)getGifData:(NSDictionary *)info//獲取圖片并寫(xiě)入文件中
{
NSURL *imageRefURL = [info valueForKey:UIImagePickerControllerReferenceURL];
ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init];
__block NSData *imgData = nil;
void (^ALAssetsLibraryAssetForURLResultBlock)(ALAsset *) = ^(ALAsset *asset) {
if (asset != nil) {
ALAssetRepresentation *rep = [asset defaultRepresentation];
Byte *imageBuffer = (Byte*)malloc(rep.size);
NSUInteger bufferSize = [rep getBytes:imageBuffer fromOffset:0.0 length:rep.size error:nil];
NSData *imageData = [NSData dataWithBytesNoCopy:imageBuffer length:bufferSize freeWhenDone:YES];
imgData = imageData;
[imgData writeToFile:[self getImgDataPath] atomically:YES];
//此處講圖片轉(zhuǎn)為 data格式并保存到本地文件夾中而克,因?yàn)樵谶@個(gè)block塊結(jié)束時(shí)靶壮,ALAsset對(duì)象銷(xiāo)毀,imageData所指向的是他對(duì)應(yīng)的指針员萍,也會(huì)銷(xiāo)毀腾降,在block外取值為空。
}
else {
//未獲取到gif
}
};
[assetsLibrary assetForURL:imageRefURL
resultBlock:ALAssetsLibraryAssetForURLResultBlock
failureBlock:^(NSError *error){
}];
}
結(jié)語(yǔ):通過(guò)本demo只能實(shí)現(xiàn)一張圖一換碎绎,如果要實(shí)現(xiàn)滾動(dòng)播放相冊(cè)所有圖片螃壤,可通過(guò)assetsLibrary的group方法實(shí)現(xiàn),具體的我也沒(méi)做(為啥筋帖?我笨奸晴、我懶、我還要寫(xiě)bug呢日麸。)寄啼,有興趣的可以自己去做。
·
·
·
·
·
·
·
·
等等,請(qǐng)放下您手中的磚頭墩划,什么事情是不可以商量的呢涕刚?求您別再砸了,再砸乙帮,我都快變成釋迦摩尼了杜漠,我這滿(mǎn)頭的包啊??。您看看我這晶瑩察净、清澈的眼睛碑幅,您看看我這陽(yáng)光、爽朗的面龐塞绿,我這不是正在寫(xiě)呢嗎沟涨。您看,寫(xiě)好了的异吻,下面就是裹赴。
ShowAllPhotosVC 部分:(查看所有圖片)
追求完美的用戶(hù)體驗(yàn),是我們的職業(yè)素養(yǎng)诀浪。每一個(gè)功能都可以通過(guò)不同的方法實(shí)現(xiàn)棋返,但是,程序員的職責(zé)是尋找最優(yōu)雅的一種雷猪。
如果說(shuō)睛竣,教育的目的,當(dāng)是傳遞生命的氣息求摇。
那么射沟,編程的目的,當(dāng)是灌注心靈的詩(shī)句与境。
[self getGroupArray];//獲取所有圖片------這里只為效果验夯,實(shí)際中,獲取圖片當(dāng)在進(jìn)入此頁(yè)面前就完成摔刁,避免用戶(hù)進(jìn)入當(dāng)前頁(yè)面的等待時(shí)間挥转。
1.通過(guò) -(void)getGroupArray;方法和 -(void)getImgArr;方法,獲取相冊(cè)中各組子相冊(cè)和相冊(cè)中所有圖片;
2.-(void)getGifData:(NSURL *)url forWeb:(UIWebView *)webView;//獲取圖片并加載;
3.創(chuàng)建三個(gè)webview共屈,加載到scrollview上绑谣,并通過(guò)三圖實(shí)現(xiàn)無(wú)限輪播(模擬器可以不這樣做,但是手機(jī)的話(huà)拗引,相冊(cè)中圖片數(shù)量可能很大借宵,會(huì)導(dǎo)致內(nèi)存問(wèn)題。)
4.但是還有個(gè)問(wèn)題寺擂,就是滑動(dòng)切換圖片的時(shí)候暇务,會(huì)有閃爍。(可能是在圖片適配webview大小的方法中的問(wèn)題:|-(void)webViewDidStartLoad:(UIWebView *)webView;中和方法:-(void)webViewDidFinishLoad:(UIWebView *)webView中|未解決怔软。歡迎指教垦细。)
呼~,摸著我這滿(mǎn)頭的智慧的疙瘩挡逼,我在想:佛祖啊括改,您的大智慧,這樣常年保持著家坎。是誰(shuí)在不停地敲打著您呢嘱能?是這信仰、訴求您的蕓蕓眾生嗎虱疏?還是您自己叭锹睢? 哎做瞪,我是懶惰了吧对粪。
最后是demo