美文网首页
iOS 浏览iphone相册中gif图片

iOS 浏览iphone相册中gif图片

作者: IThai | 来源:发表于2018-01-12 15:34 被阅读0次

    前言:
    鉴于最近业内bug数量的急剧减少,遂决定写点什么。

    概述:
    iphone相册不支持gif浏览,虽然相册中的gif是静止图但是保存的是gif格式。
    这里大概讲下我的思路:

    • 1.先通过assetslibrary取得gif图片的data格式,然后保存到本地文件夹中(因为在 ALAssetsLibraryAssetForURLResultBlock外取的值为空,我用_ _block也不行,有其他方案的欢迎指教),然后当从相册取到图片并返回到你的控制器的时候(相册代理中的[self dismissViewControllerAnimated:YES completion:^() { }中),取得你保存在本地的imgData。
    • 2.加载gif的思路有两种,一种是通过帧动画加载,另一种通过webView加载。本文是通过webView加载。将刚取得的imgData通过webView加载并显示出来。
    • 3.webView中图片过大问题处理。设置web属性页面自适应,禁止滚动;并在web加载完成代理中,控制web的contentSize;
      _webView.scalesPageToFit = YES;
      _webView.scrollView.scrollEnabled = NO;
    • 4.最后,在appDelegate中,设置程序打开及退出时,删除本地保存的图片。

    通过assetslibrary 框架获取相册中gif图片(注意获取gif图片需要将其转换为data,直接获取图片是第一帧的静止图片。)

            -(void)getGifData:(NSDictionary *)info//获取图片并写入文件中
            {
                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];
                //此处讲图片转为 data格式并保存到本地文件夹中,因为在这个block块结束时,ALAsset对象销毁,imageData所指向的是他对应的指针,也会销毁,在block外取值为空。
                }
                else {
    
                //未获取到gif
                }
                };
    
                [assetsLibrary assetForURL:imageRefURL
                resultBlock:ALAssetsLibraryAssetForURLResultBlock
                failureBlock:^(NSError *error){
                }];
            }
    
    
    结语:通过本demo只能实现一张图一换,如果要实现滚动播放相册所有图片,可通过assetsLibrary的group方法实现,具体的我也没做(为啥?我笨、我懒、我还要写bug呢。),有兴趣的可以自己去做。

    ·
    ·
    ·
    ·
    ·
    ·
    ·
    ·
    等等,请放下您手中的砖头,什么事情是不可以商量的呢?求您别再砸了,再砸,我都快变成释迦摩尼了,我这满头的包啊😭。您看看我这晶莹、清澈的眼睛,您看看我这阳光、爽朗的面庞,我这不是正在写呢吗。您看,写好了的,下面就是。

    ShowAllPhotosVC 部分:(查看所有图片)

        追求完美的用户体验,是我们的职业素养。每一个功能都可以通过不同的方法实现,但是,程序员的职责是寻找最优雅的一种。
        如果说,教育的目的,当是传递生命的气息。
        那么,编程的目的,当是灌注心灵的诗句。
     
        [self getGroupArray];//获取所有图片------这里只为效果,实际中,获取图片当在进入此页面前就完成,避免用户进入当前页面的等待时间。
    

    1.通过 -(void)getGroupArray;方法和 -(void)getImgArr;方法,获取相册中各组子相册和相册中所有图片;

    2.-(void)getGifData:(NSURL *)url forWeb:(UIWebView *)webView;//获取图片并加载;

    3.创建三个webview,加载到scrollview上,并通过三图实现无限轮播(模拟器可以不这样做,但是手机的话,相册中图片数量可能很大,会导致内存问题。)

    4.但是还有个问题,就是滑动切换图片的时候,会有闪烁。(可能是在图片适配webview大小的方法中的问题:|-(void)webViewDidStartLoad:(UIWebView *)webView;中和方法:-(void)webViewDidFinishLoad:(UIWebView *)webView中|未解决。欢迎指教。)

    呼~,摸着我这满头的智慧的疙瘩,我在想:佛祖啊,您的大智慧,这样常年保持着。是谁在不停地敲打着您呢?是这信仰、诉求您的芸芸众生吗?还是您自己啊? 哎,我是懒惰了吧。
    最后是demo

    相关文章

      网友评论

          本文标题:iOS 浏览iphone相册中gif图片

          本文链接:https://www.haomeiwen.com/subject/zdyfoxtx.html