美文网首页
显示gif动态图片

显示gif动态图片

作者: langlangago | 来源:发表于2016-02-29 10:27 被阅读592次

    在iOS中播放动态图片,常用的方法有两种,一种是利用UIWebView,一种是利用UIImageView的序列帧动画。


    使用UIWebView播放gif:
    //web播放gif动态图片
    //创建UIWebView对象并设置位置居中
    UIWebView *webView = [[UIWebView alloc] init];
    webView.center = self.view.center;
    
    //获取图片的大小
    CGSize size = [UIImage imageNamed:@"smile.gif"].size;
    webView.bounds = CGRectMake(0, 0, size.width, size.height);
    
    //将图片的webView的大小和图片的大小设置成一致
    webView.scrollView.contentSize = size;
    
    //添加到当前的ViewController上
    [self.view addSubview:webView];
    
    //关闭交互功能
    webView.userInteractionEnabled = NO;
    
    //将图片位置设置为url
    NSURL *url = [[NSBundle mainBundle] URLForResource:@"smile" withExtension:@"gif"];
    [webView loadRequest:[NSURLRequest requestWithURL:url]];  
    
    //读取gif数据 (ps:上面和下面的结果是一样的)
    //    NSData *gifData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"smile" ofType:@"gif"]];
    //下面函数中,后面两个参数,因为要和swift的?、!保持一致,所以如果为空的话会有警告
    //    [webView loadData:gifData MIMEType:@"image/gif" textEncodingName:nil baseURL:nil];
    

    用UIWebView来显示gif,有时候位置会发生偏移,这个是为什么,我也不知道,希望有知道的大大可以告诉我。为了解决这个问题,我使用了UIWebView里的delegate的webViewDidFinishLoad:方法:

    //首先设置delegate
    webView.delegate = self;
    
    //实现方法来调整位置
    - (void)webViewDidFinishLoad:(UIWebView *)webView {
        webView.scrollView.contentOffset = CGPointMake(0, 0);
    }
    

    使用UIImageView的序列帧动画播放gif

    在代码之前,我们首先要将gif的每一帧图片都取出来,使用苹果电脑打开gif图片,就可以发现其每一帧的图片,将每一帧的图片都保存为png格式(jpeg也可以,但是jpeg会失真,苹果官方推荐png格式),并命名好一系列利于循环获取的名字。将这些图片都放入到我们的项目中,我demo中的gif有4帧动画,我直接将图片的命名为 数字.png (1.png, 2.png, 3.png, 4.png)。

    //创建UIImageView对象并设置位置居中
    UIImageView *imageView = [[UIImageView alloc] init];
    imageView.center = self.view.center;
    
    //获取图片的大小
    CGSize size = [UIImage imageNamed:@"1.gif"].size;
    imageView.bounds = CGRectMake(0, 0, size.width, size.height);
    
    //将图片的imageView的大小和图片的大小设置成一致
    imageView.bounds = CGRectMake(0, 0, size.width, size.height);
    
    //添加到当前的ViewController上
    [self.view addSubview:webView];
    
    //创建一个可变数组来存储每一帧的图片    
    NSMutableArray *imageArray = [[NSMutableView alloc] init];
    
    //取出每一帧图片,存放到imageArray中
    for (int i = 1 ; i < 5; i++) {
        UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"%d.png", i]];
        NSLog(@"%@", image);
    
        [imageArray addObject:image];
    }
    
    //设置序列帧
    imageView.animationImages = imageArray;
    //设置动画播放一次的时间
    imageView.animationDuration = 0.4;
    //设置动画的重复播放次数(0为无限次播放)
    imageView.animationRepeatCount = 0;
    //开始动画
    [imageView startAnimating];
    

    使用UIImageView来播放动画,还有一个问题,就是内存占用大,特别图片多而且大的时候,所以每一次不再需要播放gif的会后,最好把这些图片都释放掉。如果只需要播放可数次数,那么可以这么设置:

    //在延迟动画的10次播放时长后,释放掉imageView.animationImages 
    NSTimeInterval delay = self.imageView.animationDuration * 10;
    [self.imageView performSelector:@selector(setAnimationImages:) withObject:nil afterDelay:delay];
    

    相比而言,我觉得使用UIWebView来显示gif会比较便捷,不用讲每一帧的图片取出,也不用担心内存的占用,唯一不科学的也就位置的问题了。

    相关文章

      网友评论

          本文标题:显示gif动态图片

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