//
// UIImageView.h
// UIKit
//
// Copyright (c) 2006-2012, Apple Inc. All rights reserved.
//
#import
#import
#import
@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];
下面直接贴代码了。有比较详细的注释。
- (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:
*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