IOS使用UIImageView显示gif动画的例子

其中用到了两个开源代码

1.SDWebImage  异步读取图片数据
2.
SCGifExample  gif动画控件

此工程在SCGifExample的基础上修改


最近SDWebImage刚升级,我也借此修改了我的代码,
从中摘出gif部分与大家分享


图片缩放部分我还是用的手势,感觉以下方法不怎么好用,如果大家有更好的算法请分享
图片缩放效果请在真机上使用

  1. - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView  
  2. {  
  3.     return imageView;  
  4. }  
  5.   
  6. - (void)scrollViewDidZoom:(UIScrollView *)scrollView  
  7. {  
  8.     imageView.center = scrollView.center;  
  9.       
  10.     if (imageView.frame.origin.x < 0)  
  11.     {  
  12.         setFrameX(imageView, 0);  
  13.     }  
  14.     if (imageView.frame.origin.y < 0)  
  15.     {  
  16.         setFrameY(imageView, 0);  
  17.     }  
  18. }  


SDWebImage内部其实也可以实现动态图片读取,我项目紧没时间改,有兴趣的可以自己改改
返回Imge时返回imageArray就可以,代码可以学习SCGifExample的实现


SDWebImage增加了4个SDWebImageManagerDelegate函数

- (void)webImageManager:(SDWebImageManager *)imageManager ActivityIndicatorView:(UIActivityIndicatorView *)activityIndicatorView didFailWithError:(NSError *)error;
- (void)webImageManager:(SDWebImageManager *)imageManager ActivityIndicatorView:(UIActivityIndicatorView *)activityIndicatorView didFinishWithImage:(UIImage *)image drawRoundedRect:(BOOL)bDraw;

// SDImageCache中有数据
- (void)webImageManager:(SDWebImageManager *)imageManager ActivityIndicatorView:(UIActivityIndicatorView *)activityIndicatorView  FileName:(NSString*)fileName didFinishWithImage:(UIImage *)image drawRoundedRect:(BOOL)bDraw;
// SDImageCache中无数据,SDWebImageDownloader下载获得
- (void)webImageManager:(SDWebImageManager *)imageManager ActivityIndicatorView:(UIActivityIndicatorView *)activityIndicatorView  ImageData:(NSData *)imageData didFinishWithImage:(UIImage *)image drawRoundedRect:(BOOL)bDraw;

(UIActivityIndicatorView *)activityIndicatorView 用于显示下载状态
在ImageView调用SDWebImageManager时加载

typedef enum
{
    SDWebImageRetryFailed = 1 << 0,
    SDWebImageLowPriority = 1 << 1,
    SDWebImageCacheMemoryOnly = 1 << 2,
    SDWebImageRoundedRect = 1 << 3
} SDWebImageOptions;
中增加了SDWebImageRoundedRect用于标示是否显示圆角图片


SCGifExample增加了2个函数

- (BOOL)setGIFFile:(NSString*)gifFilePath;
- (BOOL)setGIFData:(NSData*)gifImageData;

状态栏和工具条我没有做完,状态栏最好自定义


2012-03-16:
发现了一个问题,请自行修改
UIActivityIndicatorView有可能会重复创建,会的就不需要往下看了,我只是打了个补丁

修改如下:

  1. - (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options  
  2. {  
  3.     SDWebImageManager *manager = [SDWebImageManager sharedManager];  
  4.        
  5.     // Remove in progress downloader from queue  
  6.     [manager cancelForDelegate:self];  
  7.        
  8.     self.image = placeholder;  
  9.        
  10.     if (url)  
  11.     {  
  12.         UIActivityIndicatorView *progressInd = (UIActivityIndicatorView *)[self viewWithTag:30326];  
  13.            
  14.         if (progressInd == nil)  
  15.         {  
  16.             progressInd = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];  
  17.             progressInd.tag = 30326;  
  18.             [progressInd startAnimating];  
  19.             [self addSubview:progressInd size:CGSizeMake(37, 37)];  
  20.            
  21.             [progressInd release];  
  22.         }  
  23.            
  24.         //[manager downloadWithURL:url delegate:self options:options];  
  25.         [manager downloadWithURL:url ActivityIndicatorView:progressInd delegate:self options:options];  
  26.     }  
  27. }  


3月23日:
SDWebImage内部有点问题,当网址链接不是image时照样返回image图片数据
可以在
NS_INLINE UIImage *SDScaledImageForPath(NSString *path, NSData *imageData)
函数中增加对imageData的判断,是否为图片数据
非时返回nil

- (void)connectionDidFinishLoading:(NSURLConnection *)aConnection
函数中再判断其值返回delegate 调用 performSelector:@selector(imageDownloader:didFailWithError:)


下载地址:点击下载

新版:点击下载


最近SDWebImage改动比较频繁,我把代码也整合了一下,简化了delegate

增加了Button部分的修改,可以设置前景背景不同状态的图片

我不做工程了,只上传SDWebImage部分

下载:SDWebImage_2.6_b78238802d.zip



好久没跟这个了发现新版SDWebImage有个大问题,会随机的阻塞下载线程导致图片不能下载成功,

老版本的那个没有问题,增加gif即可


加个gif算法:

sd_isGIF在新版SDWebImage里是有的

  1. - (BOOL)animatedGIFWithData:(NSData *)data  
  2. {  
  3.     if (!data)  
  4.     {  
  5.         return NO;  
  6.     }  
  7.       
  8.     if (![data sd_isGIF])  
  9.     {  
  10.         return NO;  
  11.     }  
  12.       
  13.     CGImageSourceRef source = CGImageSourceCreateWithData(( CFDataRef)data, NULL);  
  14.       
  15.     size_t count = CGImageSourceGetCount(source);  
  16.     NSMutableArray *images = [NSMutableArray array];  
  17.       
  18.     NSTimeInterval duration = 0.0f;  
  19.       
  20.     for (size_t i = 0; i < count; i++)  
  21.     {  
  22.         CGImageRef image = CGImageSourceCreateImageAtIndex(source, i, NULL);  
  23.           
  24.         NSDictionary *frameProperties = CFBridgingRelease(CGImageSourceCopyPropertiesAtIndex(source, i, NULL));  
  25.         duration += [[[frameProperties objectForKey:(NSString*)kCGImagePropertyGIFDictionary] objectForKey:(NSString*)kCGImagePropertyGIFDelayTime] doubleValue];  
  26.           
  27.         [images addObject:[UIImage imageWithCGImage:image scale:[UIScreen mainScreen].scale orientation:UIImageOrientationUp]];  
  28.           
  29.         CGImageRelease(image);  
  30.     }  
  31.       
  32.     CFRelease(source);  
  33.       
  34.     if (!duration)  
  35.     {  
  36.         duration = (1.0f/10.0f)*count;  
  37.     }  
  38.       
  39.     if (images.count > 0)  
  40.     {  
  41.         [self setImage:[images objectAtIndex:0]];  
  42.         [self setAnimationImages:images];  
  43.   
  44.         [self setAnimationDuration:duration];  
  45.         [self setAnimationRepeatCount:0];  
  46.         [self startAnimating];  
  47.           
  48.         return YES;  
  49.     }  
  50.       
  51.     return NO;  
  52. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值