iOS 展示 gif

2023-11-18

gif 图 是多张依次有连续动作的图 顺时间展示的一种动态效果图 .   有的是均匀时间更换下一张  有的 则不是均匀时间变化

1. 那么 对于均匀 时间变化的gif图 比较适合 使用 iOS 系统自带方法 imageView 的动态展示图片的方法就好

如:

NSMutableArray *array=[NSMutableArray arrayWithCapacity:0];
for(int i=1;i   < 10;i++)
 {
   NSString *str=[NSString stringWithFormat:@"Nav_Bg%d.png",i];
UIImage
*image=[UIImage imageNamed:str];
[array addObject:image]; } UIImageView
*imageView=[[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 460)]; imageView.animationImages=array; imageView.animationDuration=1.5;//duration :持续 持续时间 imageView.animationRepeatCount=1 ;//重复次数 [self .window addSubview:imageView]; [imageView startAnimating];

以上code  表达的是 10张图 在 1.5的时间 只执行一次动画展示(不循环重复)   所以关键 是这个 1.5秒 需要表达10张图 正常一次执行的时间即可出现效果比较好的动画

2.  不确定时间gif

上述方法 是按照 给定的常量时间 1.5s 执行gif 时间, 这样的弊端 是 如果把当前方法作为通用的类方法的话,这个1.5s 很不科学 . 所以 下边的方法是首先计算图片的总时间长度 .再执行动画.

#import <UIKit/UIKit.h>
@interface MotionActiveAgeGif : UIView
{
    UIImageView *gitView;
}
@property (nonatomic ,strong) UIImageView *gitView;
@property (nonatomic ,strong)UIImageView * lastGifView;
//@property (nonatomic ,strong)NSString * gifName;
- (instancetype)initWithName:(NSString *)gifName andFrame:(CGRect)frame ;
@end



#import "MotionActiveAgeGif.h"

#import <ImageIO/ImageIO.h>
#import <QuartzCore/CoreAnimation.h>

//#define DuringTime  1.5f
@interface MotionActiveAgeGif ()
{
    float totalTime ;
    CADisplayLink *displayLink ;
}
@end
@implementation MotionActiveAgeGif
@synthesize gitView ;
@synthesize lastGifView ;
- (instancetype)initWithName:(NSString *)gifName andFrame:(CGRect)frame
{
    self = [super init];
    if (self) {
        totalTime = 0;
        gitView = [[UIImageView alloc]initWithFrame:frame];
        lastGifView =  [[UIImageView alloc]initWithFrame:gitView.frame];
        NSURL *url = [[NSBundle mainBundle] URLForResource:[NSString stringWithFormat:@"%@.gif",gifName] withExtension:nil];
        CGImageSourceRef csf = CGImageSourceCreateWithURL((__bridge CFTypeRef) url, NULL);
        size_t const count = CGImageSourceGetCount(csf);
        UIImage *frames[count];
        CGImageRef images[count];
        
        NSMutableArray *delayTimes = [NSMutableArray array];
        for (size_t i = 0; i < count; ++i) {
            images[i] = CGImageSourceCreateImageAtIndex(csf, i, NULL);
            UIImage *image =[[UIImage alloc] initWithCGImage:images[i]];
            lastGifView.image = image ;
            frames[i] = image;
            
            //CFBridgingRelease 给予arc所有权
            NSDictionary *dict = (NSDictionary*)CFBridgingRelease(CGImageSourceCopyPropertiesAtIndex(csf, i, NULL));
            NSLog(@"kCGImagePropertyGIFDictionary %@", [dict valueForKey:(NSString*)kCGImagePropertyGIFDictionary]);
            //
            NSDictionary *gifDict = [dict valueForKey:(NSString*)kCGImagePropertyGIFDictionary];
            [delayTimes addObject:[gifDict valueForKey:(NSString*)kCGImagePropertyGIFDelayTime]];
            
            if (totalTime >= 0)
            {
                totalTime = totalTime + [[gifDict valueForKey:(NSString*)kCGImagePropertyGIFUnclampedDelayTime] floatValue];
            }
            NSLog(@"%lf",totalTime);

            CFRelease(images[i]);
        }
        UIImage *const animation = [UIImage animatedImageWithImages:[NSArray arrayWithObjects:frames count:count] duration:totalTime];
        gitView.image = animation;
        gitView.animationRepeatCount =1;  //动画重复次数1  不起作用
        [gitView startAnimating];
        [self addSubview:gitView];
        self.frame = gitView.frame;
        
        [self performSelector:@selector(stopGifView) withObject:nil afterDelay:totalTime];
        CFRelease(csf);
    }
    return self;
}
- (void)stopGifView
{
    [gitView removeFromSuperview];
    [self addSubview:lastGifView];
}

 

 

转载于:https://www.cnblogs.com/someonelikeyou/p/4637134.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS 展示 gif 的相关文章

  • 【ctrl+space】键位解除占用+永久删除微软拼音输入法

    前言 多数编程软件的代码提示快捷键一般为 ctrl space 但win10默认切换输入法中英文模式快捷键也是 ctrl space 即使更改输入法热键和注册表也依然无效 只能更换输入法 发现更换为搜狗输入法后 ctrl space 热键被
  • 2023华为OD机试真题【文件目录大小】

    题目内容 一个文件目录的数据格式为 目录id 本目录中文件大小 子目录id列表 其中目录id全局唯一 取值范围 1 200 本目录中文件大小范围 1 1000 子目录id列表个数 0 10 例如 1 20 2 3 表示目录1中文件总大小是2
  • python apply函数的用法

    函数格式为 apply func args kwargs 用途 当一个函数的参数存在于一个元组或者一个字典中时 用来间接的调用这个函数 并肩元组或者字典中的参数按照顺序传递给参数 解析 args是一个包含按照函数所需参数传递的位置参数的一个
  • 2022年深圳杯A题破除“尖叫效应”与“回声室效应”走出“信息茧房”

    2022年深圳杯A题破除 尖叫效应 与 回声室效应 走出 信息茧房 为了防止更多的人走弯路 对于此题 数据随便找 数据自己造然后文档写的时候数据来源说数据爬取这样不就ok了 题里不是还写着了么 等社交媒体的数据 你考虑过么 你在写文档的时候
  • 一个或多个问题导致了安装失败。请修复这些问题,然后重试安装。有关详细信 息,请参阅日志这生。 0x80070666-已安装这个产品的另一个版本。这个版本的安装无法继续。要配 置或删除这个产品的现有版本

    目录 编辑 一个或多个问题导致了安装失败 请修复这些问题 然后重试安装 有关详细信 息 请参阅日志这生 0x80070666 已安装这个产品的另一个版本 这个版本的安装无法继续 要配 置或删除这个产品的现有版本 请用 控制面板 上的 添加删
  • [C++] IO流,文件输入输出,string流,类型转换运算符

    文章目录 类型转换运算符 循环输入原理 文件输入输出 简介 文件模式 二进制读写与文本文件读写 string 流 istringstream 使用 ostringstream 使用 类型转换运算符 循环输入原理 循环输入 有些oj题会要求我
  • OpenCV——图像分块(1)

    目录 一 概述 二 代码实现 三 结果展示 1 原始图像 2 分块结果 一 概述 已知分块后图像的分块个数 对图像进行分块 二 代码实现 include
  • list的模拟实现

    list的模拟实现 1 创建 链表结点 2 创建 链表迭代器 3 创建 链表 4 测试 模拟实现的list的功能 1 创建 链表结点 namespace JPC 创建 链表结点 template
  • 全国首批城市级5G车联网应用项目落地!

    司机变身 安全员 公交车自主选择车道 避让障碍物和行人 还能接收交通信号灯信息 实现一路畅行 近日 央视综合频道 报道了 聪明车 开上 智慧路 的黑科技 日前 依托苏州良好的车联网产业环境 全国首批城市级5G车联网应用项目落地苏州 中国移动
  • 改善java程序的151个建议 - 读书笔记

    目录 第1章 java开发中通用的方法和准则 1 字母 l 和数字1 字母 o 和数字0易混淆 3 三元操作符的类型务必一致 7 警惕自增陷阱 11 好习惯是显示声明UID 12 Serializable类中的final成员变量的赋值 14
  • 基于开源大模型Vicuna-13B构建私有制库问答系统

    本教程专注在怎么使用已经开源的模型和项目 构建一个可以私有化部署的问答知识库 而且整体效果要有所保障 主要工作包括 选择基础模型 openAI claude 这些商用的 或者其他的开源的 这次我们选择 Vicuna 13B 开源有很多的知识
  • 如何把极坐标化为直角坐标_如何将极坐标转化为直角坐标

    展开全部 极坐标转换为直角坐标 32313133353236313431303231363533e58685e5aeb931333366306532 转化方法及其步骤 第一步 把极坐标方程中的 整理成cos 和sin 的形式 第二步 把co
  • 基础15:npm、yarn、pnpm

    npm2 用 node 版本管理工具把 node 版本降到 4 那 npm 版本就是 2 x 了 执行 npm init npm install express 可以看到node modules目录如下 可以看到 npm2的node mod
  • 深入理解计算机系统(2.3)---整数的表示方式精解》无符号与补码编码(重要)...

    上一章我们简单的介绍了布尔代数以及C语言的位运算 本次我们主要来看 二进制如何表示整数 这是很重要的一章 希望各位猿友莫要错过 C语言中的整数类型及范围 我们依然以C语言为例 C语言当中提供了多种整数类型 一共十种 位数为1 2 4 8 其
  • ShellExecuteEx中与被调进程同步

    在实际的开发中会遇到这样的情况 A进程在运行时 需要调起B进程完成某些工作 例如取回关键文件 且必须等待该进程完成工作结束后才能往下继续 那么这时候 就可以采用ShellExecuteEx和WaitForSingleObject的结合对被调
  • 新媒体运营怎么追热点?这四个技巧一定可以帮到你

    作为一个新媒体运营 热点追不好 冷板凳少不了 热点追得好不但能带来账号的曝光 还能带来良好的涨粉效果 但是很多人都不知道热点到底要怎么追 那么今天就给大家分享一下 追热点4个百试不爽的套路 01 怎样找热点 热点可以分为常规型热点和突发型热
  • R语言——数据排序

    R语言中涉及排序的基本函数有order sort和rank三个 下面看看它们的基本用法 x表示需要排序的数据 decreasing表示是否按降序排序数据 method表示所使用的排序算法 na last表示如何处理NA值 缺失值 若为FAL
  • eclipse中导入idea项目的基本步骤

    eclipse导入idea项目 前段时间有个idea项目 SSM maven 需要导入eclispe运行 最后搞了很久才运行成功 这里整理一下导入项目时需要修改一些配置 第一步 import时建议选择导入Maven项目 选择Maven下的导
  • 在Centos7中搭建http服务器

    一 简介 二 安装 二 编辑配置文件 三 配置主页文件 或者将做好的网站放入根目录 四 配置安全访问规则 五 启动http服务 六 访问测试 七 心得体会 一 简介 Centos7默认的http服务器为Apache Apache HTTP
  • Python提取网页信息并保存

    使用Python爬取网页内容时 获取网页源码文件后使用一系列解析方法提取我们需要的信息 对于提取到的信息怎么保存下来 本文提供常见的两种方法 保存到本地文件或MySQL数据库 保存到本地csv文件 将数据以一定的格式保存到本地csv文件需要

随机推荐

  • 修改cdh6.3.2集群内部弱口令步骤

    在这里插入图片描述 cdh管理页面修改 hive hue oozie 密码 主节点修改 另外修订mysql数据库内密码 首先登陆mysql 具体参考 https blog csdn net weixin 43214644 article d
  • STM32---外部中断

    目录 1 外部中断描述 2 外部中断框图 总结 经过分析框图 可以产生软件中断和事件中断 软件中断的目的是进中断服务函数 事件中断是产生一个脉冲信号给片内外设 属于硬件级别的 3 各寄存器作用 4 端口对应 5 编程思路 EXIT NVIC
  • mysql8.0出现group by报错

    数据库跟目录执行set GLOBAL sql mode STRICT TRANS TABLES NO ZERO IN DATE NO ZERO DATE ERROR FOR DIVISION BY ZERO NO ENGINE SUBSTI
  • Qt 使用笔记 --转自 wangwenx190/Note

    转自 https github com wangwenx190 notes blob master qt zh cn md Qt 使用笔记 Qt 6 目标平台变更 Qt6 不再支持32位Windows系统 不再支持Windows 7 Win
  • pageHelper.startPage(m,n)的用法

    pageHelper startPage m n 的用法 pageHelper startPage m n 是分页查询 PageHelper startPage m n 两个参数 第一个参数是页数 第二个参数是条数 每页查询的条数 例如我想
  • 疯壳AI开源无人机SPI(六轴传感器数据获取)

    一 ICM20602简介 六轴传感器在当今智能穿戴和定位导航产品中被广泛应用 而六轴传感器中做的最好的要属InvenSense公司的产品了 ICM20602便是其推出的优秀六轴传感器之一 ICM20602集成3轴加速度计和3轴陀螺仪 其中陀
  • bat命令备份oracle数据库,并且删除7天之前的数据文件

    用批处理命令备份oracle数据库 我是用在windows server 2008 服务器上 并且创建了定时任务 让他7天执行一次 下面贴出代码 echo off echo echo Windows环境下Oracle数据库的自动备份脚本 e
  • Fast DDS入门五、在Windows平台创建一个简单的Fast DDS示例程序

    1 创建简单示例程序 在这里 先建立一个IDL文件 然后通过使用Fast DDS Gen生成程序生成这个简单示例程序 Fast DDS Gen程序的编译安装请参考 Fast DDS入门二 Fast DDS在Windows平台的编译安装 Fa
  • 狂热的NFT,泡沫还是风口?

    比特币市场狂热的NFT今年以来 不仅 元宇宙 爆火 NFT Non Fungible Token 非同质化代币 也掀起一波波炒作热潮 3月份 数字艺术家Beeple的NFT作品 每一天 前5000天 在佳士得拍卖行以6934万美元成交 创造
  • 解决查询时报的cannot be cast to com.credithc.enjoy.manager.OrderResp错误

    报的错误如下所示 14 30 54 637 ERROR http nio 8094 exec 4 127 0 0 1 f6c45349d812457bbb5e42bc3a1bc09d 1 0 com credithc enjoy manag
  • 【Python函数的递归】

    递归的定义 函数作为一种代码封装 可以被其他程序调用 当然 也可以被函数内部代码调用 这种函数定义中调用函数自身的方式称为递归 就像一个人站在装满镜子的房间中 看到的影像就是递归的结果 递归在数学和计算机应用上非常强大 能够非常简洁的解决重
  • 可视化的数据结构和算法

    转载自 http sd csdn net a 20110506 297285 html 导读 作者陈皓之前写过关于可视化排序的一篇文章 现在他又给大家罗列出可视化的数据结构和算法来供大家学习参考 文中分别从基础 索引 排序 动态编程等方面进
  • 微软句向量工具包Sent2vec

    工具介绍 What is sent2vec sent2vec maps a pair of short text strings e g sentences or query answer pairs to a pair of featur
  • 关于 OneNote 无法正常同步 问题

    问题 无法正常同步 备注 问题开始之前请刷新一下DNS缓存 https blog csdn net ljason1993 article details 83040313 看一下 无法正常同步 意思是卡同步条 一直显示同步条问题 就这个绿条
  • 如何找Ubuntu的历史版本的iso镜像文件

    目录 1 中文网站上的查找 2 英文网站上的查找 1 中文网站上的查找 中文网站为 企业开源和Linux UbuntuUbuntu是适用于企业服务器 桌面电脑 云 IoT物联网的现代化开源Linux操作系统 Ubuntu官网 https c
  • 计算机网络安全论文选题提纲,计算机网络安全毕业论文提纲

    计算机网络安全毕业论文提纲 想要写好一篇论文 首先需要一份提纲 理清思路 才能帮助你顺利的写好论文 那么 计算机网络安全毕业论文提纲又应该怎样写呢 下面是小编为大家整理的计算机网络安全毕业论文提纲 欢迎参考 题目 主标题 数据结构课程建设
  • 【软件工程】详细设计说明书

    详细设计说明书 1引言 1 1编写目的 说明编写这份详细设计说明书的目的 指出预期的读者 该文档实在概要设计的基础上 进一步的细化系统结构 展示了软件啊结构的图标 物理设计 数据结构设计 及算法设计 详细的介绍了系统各个模块是如何实现的 包
  • 【Go语言核心手册11】context.Context

    往期精选 欢迎转发 如何看待程序员35岁职业危机 Java全套学习资料 14W字 耗时半年整理 我肝了三个月 为你写出了GO核心手册 消息队列 从选型到原理 一文带你全部掌握 肝了一个月的ETCD 从Raft原理到实践 更多 11 1 内容
  • 仓储系统货位优化毕业论文【Flexsim仿真】

    一 内容简介 由堆垛机 货架 输送系统 管理系统 控制系统等组成的传统堆垛式仓储系统因为其成熟的技术和推广方式 高效等特点广泛的应用在物流 车间 制造等行业 但是堆垛机仓库每个巷道都会拥有一台堆垛机 其作业方式受到限制 鲁棒性比较差 一个巷
  • iOS 展示 gif

    gif 图 是多张依次有连续动作的图 顺时间展示的一种动态效果图 有的是均匀时间更换下一张 有的 则不是均匀时间变化 1 那么 对于均匀 时间变化的gif图 比较适合 使用 iOS 系统自带方法 imageView 的动态展示图片的方法就好