iOS gif显示

//
//  UIImageView.h
//  UIKit
//
//  Copyright (c) 2006-2012, Apple Inc. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <UIKit/UIView.h>
#import <UIKit/UIKitDefines.h>

@class UIImage;

NS_CLASS_AVAILABLE_IOS(2_0) @interface UIImageView : UIView {
  @private
    id _storage;
}

- (id)initWithImage:(UIImage *)image;
- (id)initWithImage:(UIImage *)image highlightedImage:(UIImage *)highlightedImage NS_AVAILABLE_IOS(3_0);

@property(nonatomic,retain) UIImage *image;                                                     // default is nil
@property(nonatomic,retain) UIImage *highlightedImage NS_AVAILABLE_IOS(3_0);      // default is nil
@property(nonatomic,getter=isUserInteractionEnabled) BOOL userInteractionEnabled;               // default is NO

@property(nonatomic,getter=isHighlighted) BOOL highlighted NS_AVAILABLE_IOS(3_0); // default is NO

// these allow a set of images to be animated. the array may contain multiple copies of the same

@property(nonatomic,copy) NSArray *animationImages;            // The array must contain UIImages. Setting hides the single image. default is nil
@property(nonatomic,copy) NSArray *highlightedAnimationImages NS_AVAILABLE_IOS(3_0);            // The array must contain UIImages. Setting hides the single image. default is nil

@property(nonatomic) NSTimeInterval animationDuration;         // for one cycle of images. default is number of images * 1/30th of a second (i.e. 30 fps)
@property(nonatomic) NSInteger      animationRepeatCount;      // 0 means infinite (default is 0)

- (void)startAnimating;
- (void)stopAnimating;
- (BOOL)isAnimating;

@end

相信看了上面的代码,大家都晓得了。这是imageview中的方法。

其中image,highlightedImage 大家都清楚就是设置图片。

那么同样,animationImages, highlightedAnimationImages  这两个是数组,其实就是每一帧的图片加到里面就可以了。

如果大家手头上刚好有一个gif的所有帧。那么就可以写下gif来看看了。当然最简单的还是webview

[_imageview_gif setAnimationImages:[NSArray arrayWithObjects:[UIImage imageNamed:@"gif_01"],[UIImage imageNamed:@"gif_02"],[UIImage imageNamed:@"gif_03"], nil]];
    [_imageview_gif setContentMode:UIViewContentModeCenter];
    [_imageview_gif setAnimationDuration:0.3];
    [_imageview_gif startAnimating];

2.如果是网上的图片呢?既然知道显示的原理,那么。现在我们只需要把gif的每帧取出来就可以了

下面直接贴代码了。有比较详细的注释。

- (void)create
{
    /*
     *path :    本地gif路径
     *NSLog:    /Users/xx/Library/Application Support/iPhone Simulator/6.1/Applications/423061D3-006A-4F61-9E9E-E0D889728D87/AllTest.app/test.gif
     *data :    取得这个gif
     */
    NSString *path = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"gif"];
    NSData *data = [NSData dataWithContentsOfFile:path];
    /*
     *gifLoopCount  : 设置一个gif的循环属性 ,值为0
     *NSLog:    
     *{
     *   LoopCount = 0;
     *}
     */
    NSDictionary *gifLoopCount = [NSDictionary dictionaryWithObjectsAndKeys:
                                  [NSNumber numberWithInt:0] , (NSString *)kCGImagePropertyGIFLoopCount,nil
                                  ];
    /*
     *创建gif属性,可以看到只有一个属性,个人理解为:
     *      因为要得到gif,就必须创建gif,而创建就要有属性,所以这里设置了一个无用的属性,无限循环。用于创建gif,并且不覆盖原属性
     *NSLog:
     *{
     *  "{GIF}" =     {
     *      LoopCount = 0;
     *  };
     *}
     */
    NSDictionary * gifProperties = [NSDictionary dictionaryWithObject:gifLoopCount forKey:(NSString *)kCGImagePropertyGIFDictionary] ;
    /*
     *根据属性 还有data 得到gif,并存在CGImageSourceRef中   
     *NSLog:    <CGImageSource 0x8d58740 [0x243a4d8]>
     *CFDictionaryRef ,得到gif的真正属性.
     *NSLog:
     *{
     *    ColorModel = RGB;
     *    Depth = 8;//
     *    HasAlpha = 1;
     *    PixelHeight = 22;
     *    PixelWidth = 22;
     *    "{GIF}" =     {
     *        DelayTime = "0.1";
     *        UnclampedDelayTime = "0.1";
     *    };
     *}
     *为什么要保存原属性呢。因为我们需要gif的原始延迟时间
     */
    CGImageSourceRef gif = CGImageSourceCreateWithData((__bridge  CFDataRef)(data), (__bridge  CFDictionaryRef)gifProperties);
    CFDictionaryRef gifprops =(CGImageSourceCopyPropertiesAtIndex(gif,0,NULL));
    /*
     *count :  gif的张数
     *NSLog:
     *(NSInteger) count = 19
     */
    NSInteger count =CGImageSourceGetCount(gif);
    /*
     *delay:    得到原始延迟时间
     *NSLog
     *{
     *    DelayTime = "0.1";
     *    UnclampedDelayTime = "0.1";
     *}
     */
    CFDictionaryRef  gifDic = CFDictionaryGetValue(gifprops, kCGImagePropertyGIFDictionary);
    //[gifprops objectForKey:(NSString *)kCGImagePropertyGIFDictionary];
    
    NSNumber * delay = CFDictionaryGetValue(gifDic, kCGImagePropertyGIFDelayTime);
    //[gifDic objectForKey:(NSString *)kCGImagePropertyGIFDelayTime];
    NSNumber * w = CFDictionaryGetValue(gifprops, @"PixelWidth");
    NSNumber * h =CFDictionaryGetValue(gifprops, @"PixelHeight");
    /*
     *记算播放完一次gif需要多长时间。imageview播放动画需要这个时间
     */
    NSTimeInterval totalDuration  = delay.doubleValue * count;
    CGFloat pixelWidth = w.intValue;
    CGFloat pixelHeight = h.intValue;
    
    /*
     *循环取得gif中的图片然后加到数组中。
     */
    NSMutableArray *images = [[NSMutableArray alloc] init];
    for(int index=0;index<count;index++)
    {
        CGImageRef ref = CGImageSourceCreateImageAtIndex(gif, index, nil);
        UIImage *img = [UIImage imageWithCGImage:ref];
        [images addObject:img];
        CFRelease(ref);
    }
    
    CFRelease(gifprops);
    CFRelease(gif);
    /*
     *记得释放
     */
    [_imageview_gif setBounds:CGRectMake(0, 0, pixelWidth, pixelHeight)];
    [_imageview_gif setAnimationImages:images];
    [_imageview_gif setAnimationDuration:totalDuration];
    [_imageview_gif startAnimating];
    
}

当前,播放GIF的方法,有很多。希望可以帮到大家。加到群里来的交流的朋友。希望大家不要过来直接加我的QQ,可以先在群里询问下。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值