加载gif图片,过渡效果:

调用:

- (id)initWithGifView:(UIView *)view

{

self = [super initWithView:view];

if (self) {

self.color = [UIColor clearColor];

NSString  *filePath = [[NSBundle bundleWithPath:[[NSBundle mainBundle] bundlePath]] pathForResource:@"loading2.gif" ofType:nil];

NSData  *imageData = [NSData dataWithContentsOfFile:filePath];

UIImageView *loadingImgView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 110, 90)];

loadingImgView.contentMode = UIViewContentModeCenter;

loadingImgView.image = [UIImage sd_animatedGIFWithData:imageData];

self.customView = loadingImgView;

self.mode = MBProgressHUDModeCustomView;

[view addSubview:self];

[self show:YES];

}

return self;

}

封装:

+ (UIImage *)sd_animatedGIFWithData:(NSData *)data {

if (!data) {

return nil;

}

CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef)data, NULL);

size_t count = CGImageSourceGetCount(source);

UIImage *animatedImage;

if (count <= 1) {

animatedImage = [[UIImage alloc] initWithData:data];

}

else {

NSMutableArray *images = [NSMutableArray array];

NSTimeInterval duration = 0.0f;

for (size_t i = 0; i < count; i++) {

CGImageRef image = CGImageSourceCreateImageAtIndex(source, i, NULL);

duration += [self sd_frameDurationAtIndex:i source:source];

[images addObject:[UIImage imageWithCGImage:image scale:[UIScreen mainScreen].scale orientation:UIImageOrientationUp]];

CGImageRelease(image);

}

if (!duration) {

duration = (1.0f / 10.0f) * count;

}

animatedImage = [UIImage animatedImageWithImages:images duration:duration];

}

CFRelease(source);

return animatedImage;

}

+ (float)sd_frameDurationAtIndex:(NSUInteger)index source:(CGImageSourceRef)source {

float frameDuration = 0.1f;

CFDictionaryRef cfFrameProperties = CGImageSourceCopyPropertiesAtIndex(source, index, nil);

NSDictionary *frameProperties = (__bridge NSDictionary *)cfFrameProperties;

NSDictionary *gifProperties = frameProperties[(NSString *)kCGImagePropertyGIFDictionary];

NSNumber *delayTimeUnclampedProp = gifProperties[(NSString *)kCGImagePropertyGIFUnclampedDelayTime];

if (delayTimeUnclampedProp) {

frameDuration = [delayTimeUnclampedProp floatValue];

}

else {

NSNumber *delayTimeProp = gifProperties[(NSString *)kCGImagePropertyGIFDelayTime];

if (delayTimeProp) {

frameDuration = [delayTimeProp floatValue];

}

}

// Many annoying ads specify a 0 duration to make an image flash as quickly as possible.

// We follow Firefox's behavior and use a duration of 100 ms for any frames that specify

// a duration of <= 10 ms. See <rdar://problem/7689300> and <http://webkit.org/b/36082>

// for more information.

if (frameDuration < 0.011f) {

frameDuration = 0.100f;

}

CFRelease(cfFrameProperties);

return frameDuration;

}

+ (UIImage *)sd_animatedGIFNamed:(NSString *)name {

CGFloat scale = [UIScreen mainScreen].scale;

if (scale > 1.0f) {

NSString *retinaPath = [[NSBundle mainBundle] pathForResource:[name stringByAppendingString:@"@2x"] ofType:@"gif"];

NSData *data = [NSData dataWithContentsOfFile:retinaPath];

if (data) {

return [UIImage sd_animatedGIFWithData:data];

}

NSString *path = [[NSBundle mainBundle] pathForResource:name ofType:@"gif"];

data = [NSData dataWithContentsOfFile:path];

if (data) {

return [UIImage sd_animatedGIFWithData:data];

}

return [UIImage imageNamed:name];

}

else {

NSString *path = [[NSBundle mainBundle] pathForResource:name ofType:@"gif"];

NSData *data = [NSData dataWithContentsOfFile:path];

if (data) {

return [UIImage sd_animatedGIFWithData:data];

}

return [UIImage imageNamed:name];

}

}

- (UIImage *)sd_animatedImageByScalingAndCroppingToSize:(CGSize)size {

if (CGSizeEqualToSize(self.size, size) || CGSizeEqualToSize(size, CGSizeZero)) {

return self;

}

CGSize scaledSize = size;

CGPoint thumbnailPoint = CGPointZero;

CGFloat widthFactor = size.width / self.size.width;

CGFloat heightFactor = size.height / self.size.height;

CGFloat scaleFactor = (widthFactor > heightFactor) ? widthFactor : heightFactor;

scaledSize.width = self.size.width * scaleFactor;

scaledSize.height = self.size.height * scaleFactor;

if (widthFactor > heightFactor) {

thumbnailPoint.y = (size.height - scaledSize.height) * 0.5;

}

else if (widthFactor < heightFactor) {

thumbnailPoint.x = (size.width - scaledSize.width) * 0.5;

}

NSMutableArray *scaledImages = [NSMutableArray array];

UIGraphicsBeginImageContextWithOptions(size, NO, 0.0);

for (UIImage *image in self.images) {

[image drawInRect:CGRectMake(thumbnailPoint.x, thumbnailPoint.y, scaledSize.width, scaledSize.height)];

UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();

[scaledImages addObject:newImage];

}

UIGraphicsEndImageContext();

return [UIImage animatedImageWithImages:scaledImages duration:self.duration];

}

我调用的类是继承MBProgressHUD的。大家看的时候自己在研究下。

加载gif图过渡效果的更多相关文章

  1. Android 高清加载巨图方案 拒绝压缩图片

    Android 高清加载巨图方案 拒绝压缩图片 转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/49300989: 本文出自:[张 ...

  2. Unity使用脚本进行批量动态加载贴图

    先描述一下我正在做的这个项目,是跑酷类音游. 那么跑酷类音游在绘制跑道上的时候,就要考虑不同的砖块显示问题.假设我有了一个节奏列表,那么我们怎么将不同的贴图贴到不同的砖块上去呢? 我花了好几个小时才搞 ...

  3. 简易仿ios菊花加载loading图

    原文链接:https://mp.weixin.qq.com/s/wBbQgOfr59wntNK9ZJ5iRw 项目中经常会用到加载数据的loading显示图,除了设计根据app自身设计的动画loadi ...

  4. Android内存优化————加载长图

    项目中总会遇到加载长图的需求,图片的长度可能是手机长度的很多倍,也就是需要通过滑动来查看图片.比较简单的实现方式就是使用ScrollView来加载长图,但是这样做有一个很严重的问题,就是内存消耗严重. ...

  5. SurfaceView加载长图

    1:SurfaceView加载长图,移到.可以充当背景 效果截图 2:View (淡入淡出动画没实现:记录下) package com.guoxw.surfaceviewimage; import a ...

  6. React-Native 之 GD (二十)removeClippedSubviews / modal放置的顺序 / Android 加载git图\动图 / 去除 Android 中输入框的下划线 / navigationBar

    1.removeClippedSubviews 用于提升大列表的滚动性能.需要给行容器添加样式overflow:’hidden’.(Android已默认添加此样式)此属性默认开启 这个属性是因为在早期 ...

  7. H5异步加载多图

    异步加载多图(可能没啥用,加载慢)(图片预加载,提前给浏览器缓存图片) 1. 用一个计数变量记录需要加载的图片个数 2. 用new Image()去加载,加载完给此对象的src赋值要加载的url路径( ...

  8. Android 高清加载巨图方案, 拒绝压缩图片

    源地址:http://blog.csdn.net/lmj623565791/article/details/49300989 一.概述 距离上一篇博客有段时间没更新了,主要是最近有些私事导致的,那么就 ...

  9. 关于JVM加载内存图学习小密招

    先看如下代码: Person.java public class Person { private String name; private int age; static int count = 0 ...

随机推荐

  1. 禁止chrome中CORS跨域资源共享错误

    在开发中,可以通过命令行命令chrome --allow-file-access-from-files来 禁止CORS错误. 只在紧急情况下使用这个方法,比如你的老板正站在你身后, 并且所有事情都无法 ...

  2. 通俗理解angularjs中的$apply,$digest,$watch

    <!DOCTYPE html> <html lang="zh-CN" ng-app="app"> <head> <me ...

  3. (五)JS学习笔记 - JQuery缓存机制

    历史背景 开发中常常因为方便,把状态标志都写到dom节点中,也就是HTMLElement,缺点: 循环引用 直接暴露数据,安全性? 增加一堆的自定义属性标签,对浏览器来说是没意义的 取数据的时候要对H ...

  4. js学习笔记——数组方法

    join() 把数组中所有元素转化为字符串并连接起来,并返回该字符串, var arr=[1,2,3]; var str=arr.join("#"); //str="1# ...

  5. 容器 SET part2

    (6) insert   STL中为什么提供这样的set的insert呢? 这个成员函数存在的目的是为了插入效率的问题.函数参数中的 __position 只是一个提示值,表示在这个位置附近(可前可后 ...

  6. 移动端远程关闭PC端实现(一)需求设计

    公司有台半新不旧的电脑,因无甚大用,就拿来做了服务器,服务于民.服务器所提供的功能不是太多,无非是数据库以及svn服务. 公司每天下班会断电,我们吧会常常忘记关闭服务器,所以服务器非正常关机的次数约等 ...

  7. 如何用js检测手机是否安装某个app

    问题描述 如果本地安装了app那么直接打开,否则苹果要跳转到app-store,安卓则要跳到对应的市场 解决方案 一 //html代码中 的 a 标签,以微信为例,默认的是调用weixin schem ...

  8. Microsoft.Practices.Unity 给不同的对象注入不同的Logger

    场景:我们做项目的时候常常会引用第三方日志框架来帮助我们记录日志,日志组件的用途主要是审计.跟踪.和调试.就说我最常用的日志组件log4net吧,这个在.NET同行当中应该算是用得非常多的一个日志组件 ...

  9. 简述TVS是的命名和封装

    1. 瞬态抑制二极管简称TVS (Transient Voltage Suppressor ),TVS的电气特性由P-N结面积,参杂浓度及晶片阻质决定的.其耐突波电流的能力与其P-N结面积成正比. 特 ...

  10. 用Altium designer画PCB的一般心得

    一.电路版设计的先期工作 1.利用原理图设计工具绘制原理图,并且生成对应的网络表.当然,有些特殊情况下,如电路版比较简单,已经有了网络表等情况下也可以不进行原理图的设计,直接进入PCB设计系统,在PC ...