首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

UIImageView startAnimating:你如何让它停止在系列的最后一张图片上?

当使用UIImageView的startAnimating方法来播放一系列的图片时,如果想要在最后一张图片上停止,可以使用以下方法:

  1. 使用NSTimer定时器:

startAnimating方法中,可以创建一个NSTimer定时器,并设置适当的时间间隔。在定时器的回调方法中,检查当前显示的图片是否是最后一张,如果是,则调用stopAnimating方法停止动画。

代码语言:objective-c
复制
- (void)startAnimatingWithTimer {
    NSArray *images = @[image1, image2, image3];
    NSInteger count = images.count;
    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(timerFired:) userInfo:@{@"images": images} repeats:YES];
    _timer = timer;
}

- (void)timerFired:(NSTimer *)timer {
    NSArray *images = timer.userInfo[@"images"];
    static NSInteger index = 0;
    if (index == images.count) {
        index = 0;
    }
    UIImage *image = images[index];
    self.image = image;
    index++;
}

- (void)stopAnimating {
    [_timer invalidate];
    _timer = nil;
}
  1. 使用CAKeyframeAnimation动画:

使用CAKeyframeAnimation动画可以更好地控制图片序列的播放。在动画的回调方法中,检查当前显示的图片是否是最后一张,如果是,则设置动画的removedOnCompletion属性为NO,并调用stopAnimating方法停止动画。

代码语言:objective-c
复制
- (void)startAnimatingWithKeyframeAnimation {
    NSArray *images = @[image1, image2, image3];
    CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"contents"];
    animation.duration = 1.0;
    animation.values = images;
    animation.repeatCount = 1;
    animation.delegate = self;
    [self.layer addAnimation:animation forKey:@"imageAnimation"];
}

- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag {
    if (flag) {
        [self.layer removeAnimationForKey:@"imageAnimation"];
        self.image = [anim.values lastObject];
    }
}

- (void)stopAnimating {
    [self.layer removeAnimationForKey:@"imageAnimation"];
}

这两种方法都可以实现在系列的最后一张图片上停止动画的效果。可以根据实际需求选择合适的方法。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【IOS 开发】基本 UI 控件详解 (UISegmentedControl | UIImageView | UIProgressView | UISlider | UIAlertView )

UISegmentedControl 控件属性 (1) Style 属性 Style 属性 :  -- Plain : 分段控件使用最普通风格; -- Bordered : 最普通风格添加一圈边框...: 设置 UIImageView 动画重复次数; -- startAnimating : 开始播放动画; -- stopAnimating : 停止播放动画; -- isAnimating : 判断..., 只水平或垂直方向某一个方向是完整, 另一个方向截取; -- Center : 不缩放图片, 显示图片中间区域; -- Top : 不缩放图片, 显示图片顶部区域; -- Bottom : 不缩放图片...设置进度条完成图片; -- 注意 : 该属性 Interface Builder 中没有体现出来; (6) trackImage 属性 trackImage 属性 : 设置进度条轨道图片; -- 注意...; -- 缩放主体 : 图片缩放只 UIEdgeInsets 定义 四个属性值 区域缩放, 图片中心部分是不进行缩放; 3.

2.9K40
  • 【 iOS 应用开发 】 UIKit 控件 ( 代码生成控件 | UIView 属性方法 | Storyboard | Bundle | Property List | 动画 | 图片内存优化 )

    输入方法名称 , 选择控件类型 , 选择触发操作 , 选择传入参数 即可生成点击方法 ; // 一张 图片 - (IBAction)lastImage:(UIButton *)sender { }...enabled 属性 设置 YES NO 值 来 设置 可用 禁用 属性 ; 显示第一张图片时 , 左 按钮 禁用 , 显示 最后一张图片时 , 右 按钮 禁用 ; 其它情况 左右按钮 都可用 ;...动画 相关方法 ( ① 开始播放 | ② 停止播放 | ③ 是否正在播放 ) UIImageView 动画相关方法 : 1.开始播放 : - (void)startAnimating; 2.停止播放...: 1.首先判断 动画 是否执行 : 动画执行 操作 会覆盖 一次 动画 , 每次 调用 startAnimating 都会 重新开始 执行动画 , 因此 当动画正在 执行时 , 不要覆盖 ;...开始执行动画 [self.imageView startAnimating]; 6.清除动画图片方法 : 直接将 UIImageView animationImages 动画图片数组 设置为

    3.9K40

    SceneKit - 提供两种最常用将序列帧动画渲染到模型方式

    本节学习目标 提供两种将序列帧动画渲染到模型方式 准备一组动画图片跟着教程一起做 ?...第二种方式 - 将uiimageview 渲染到模型 // 第一步 创建持有动画imageView let imageView = UIImageView() imageView.frame...= images imageView.animationDuration = 1 imageView.animationRepeatCount = -1 imageView.startAnimating...diffuse.contents = imageView 这个时候,运行程序是没有动画效果,因为模型是静止,scenekit 不会对静止模型实时渲染,这个时候要让模型渲染imageview 有两种办法...,第一种就是模型小幅度运动,但用户察觉不到,另外一种方式如下 scnView.isPlaying = true 这个时候运行程序 序列帧动画已经开始执行了 效果如下 ?

    95710

    SDWebImage源码阅读-第三篇

    主要逻辑和下载单张图片差不多,每下载成功一张,就添加到animationImages中,然后做动画。...举例来说,如果拍摄时相机摆放角度为逆时针旋转90度(对应着EXIF值为8),拍摄出来图片显示效果为顺时针旋转了90度(这就好比查看时相机又摆正了,实际windows下图片查看器显示为顺时针旋转了...最后就是通过UIImage-imageWithCGImage:scale:orientation:方法创建图片。...在网上有很多介绍如何获取正向图片方法,它们思路大多是这样:根据图片方向值来逆向旋转图片。...殊不知,apple早就为提供好了-imageWithCGImage:scale:orientation:方法来直接创建出一个可正常显示图片

    1.3K50

    iOS小技能(开发规范): weak和strong修饰符规范使用

    即使声明一个NSString属性,有人可能传入一个NSMutableString实例,然后在你没有注意情况下修改。 数字型,比如int ,就是使用assign。...一旦最后一个strong型指针离去 ,这个对象将被释放,所有剩余weak型指针都将被清除。 例子: 想象我们对象是一条狗,狗想要跑掉(被释放)。  strong型指针就像是栓住狗。...II tom 基本实现(序列帧动画) UIImageView 帧动画使用 UIImage两种加载方式 : 有缓存方式加载方法 无缓存方式将图片加载至内存 重复代码封装抽取:等优化完毕之后,删除被优化旧代码...//顺序改变UIImageView image,此时需要参数有:需要播放序列帧图片数组animationImages(UIImage对象)、帧动画持续时间animationDuration、帧动画执行次数...animationRepeatCount--可自行查看UIImageView属性和方法 //动画图片数组--可修改数组NSMutableArray(manage a modifiable

    91150

    iOSGIF动画效果实现

    本文选自《iOS动画——核心技术与案例实战》 GIFiOS中使用场景 GIFiOS中使用场景有以下三个方面。 (1)GIF图片分解为单帧图片。 (2)一系列单帧图片合成GIF图片。...所以本书中我们不去研究GIF分解合成算法具体实现方式,而是将注意力聚焦如何使用ImageIO框架实现需要功能上。...第7行和第8行设置UIImageView实例对象frame位置属性以及图片拉伸方式,这里设置为居中显示。第9行将UIImageView添加到self.view图层。...第10行将初始化加载67张图片添加到UIImageView实例animationImages,相当于设置UIImageView内容。第11行设置UIImageView图片动画播放周期。...最后一行启动UIImageView多帧图片展示动画。 ?

    1.3K20

    直播APP常用动画效果

    一个复杂礼物动画,首先是美术给出gif实现草图和素材,技术进行动画剖析和图片压缩,程序中加载图片和实现动画,其中要注意内存和CPU占用。 ?...所以每次访问NSCache,即使一次已经加载过,也需要判断返回值是否为空。 3、图片裁剪 为了减少图片资源大小,有时候会把多个帧动画做成连续一张图。...天使 时间轴实现 为了动画按照时间顺序一一执行,可以把动画按时间和对象分成多个方法,通过GCD指定时间调用。...y坐标进行操作; 设定好起始位置、经过位置,最后回到起始位置,即可实现上下往返效果。...; 另外一种是通过UIImageView支持,实现帧动画。

    1.6K80

    【iOS 开发】初识函数式 Swift 实用

    Swift 语言特性使得非常适合被用于以函数式编程思想,如果还没开始用函数式方式来使用它,那么可以从现在开始,尝试着利用函数式便利性。...(indicateView) 我刚刚写了上面这段代码,来我的当前页面显示名为 “how2use” 这张图片。...看起来好像是我做了三件事: 根据 frame 创建 UIImageView 根据图片名称配置 UIImageViewUIImageView 作为 subview 传给其他 view 但是实际,我只需要...思考 上面这些代码优势在于:类似 indicateView 这种东西,用一次就不要了,没必要引入新名称,不便于理解和记忆,我们就可以函数式地把解决掉,代码更精简易读。...特别是用这种方式来给图片做滤镜处理时候,一张图片先高斯模糊再打马赛克,先打马赛克再高斯模糊是完全不同

    51530

    Swift中创建可缩放图像视图

    在你iOS应用中添加捏合变焦功能分步指南 照片:Markus WinkleronUnsplash 没有什么比完美的图片更能让应用程序熠熠生辉,但如果你想应用程序用户真正参与并与图片互动呢...本教程中,我们将建立一个可缩放、可平移图像视图来实现这一功能。 计划 他们说,一张图片胜过千言万语--但它不一定要花上一千行代码!对于我们可缩放图像视图,我们要做成为一个可缩放视图。...基本,我们将在UIScrollView中嵌套一个包含图片UIImageView,它将处理所有我们扔给它缩放、平移(和点击!)手势。...我们现在可以通过双击来放大/缩小我们图片了。 最后思考 这是一个伟大可重复使用类,只要你想图片变大,就可以把拿出来。...这也不仅仅适用于图片视图--如果你想UIView可缩放,可以采取同样方法,用UIView而不是图片名称初始化类。可以尝试一下!

    5.7K20

    YYImage 源码剖析:图片处理技巧

    引言 首先问一个问题:会用图片么? 图片是现代化 APP 界面设计里应用广泛东西,精美的图片可以带来视觉享受,提高用户体验。...一张图片从磁盘中显示到屏幕上过程大致如下:从磁盘加载图片信息、解码二进制图片数据为位图、通过 CoreAnimation 框架处理最终绘制到屏幕。...而系统默认是主线程执行,所以业界通常有一种做法是,异步强制解压,也就是异步线程主动将二进制图片数据解压成位图数据,使用CGBitmapContextCreate(...)系列方法就能实现。...该处理方式众多图片处理框架下都有体现。 3、超大图处理 值得注意是,可能业务中需要载入一张很大图片。...该类重写了一系列方法它们都走自定义配置: - (void)setImage:(UIImage *)image { if (self.image == image) return; [self

    1.4K41

    优雅处理网络数据,真的会吗?不如看看这篇.

    所以作为 iOS 开发者我们,日常开发中,也早已不是处理显示零星数据这么简单,为了流量往往我们需要在 App 里显示大量有价值信息来吸引用户,如何优雅显示这些海量数据,考量就是个人经验了...在这篇文章中,将会学到以下内容: 1. App 可以无限滚动(infinite scrolling),并且滚动数据无缝加载 2. App 数据滚动时避免卡顿,实现平滑如丝滚动 3.异步存储...为了改善应用程序体验, iOS 10 ,Apple 对 UICollectionView 和 UITableView 引入了 Prefetching API,提供了一种需要显示数据之前预先准备数据机制...如何避免滚动时的卡顿 当你遇到滚动卡顿应用程序时,通常是由于任务长时间运行阻碍了 UI 主线程更新,想主线程有空来响应这类更新事件,第一步就是要将消耗时间任务交给子线程去执行,避免获取数据时阻塞主线程...苹果提供了很多为应用程序实现并发方式,例如 GCD,我在这里对 Cell 图片进行异步加载使用就是

    1.4K20

    MJRefresh源码剖析与学习

    最后更新:】 //isToday ?...1、MJRefreshStateHeader添加了箭头和菊花 2、布局这两种样式View,且状态切换时更改样式切换 1、圈圈(菊花)和箭头布局 - (void)placeSubviews...,需要注意箭头菊花紧跟刷新文字或者状态文字居中逻辑,我已在注释写明 2、不同状态下菊花和箭头互换 - (void)setState:(MJRefreshState)state {...= MJRefreshStateIdle || images.count == 0) return; //状态不是闲置或者图片为空,则直接返回 // 停止动画 [self.gifView...", @"隐藏刷新状态文字", @"全部加载完毕", @"禁止自动加载", @"自定义文字", @"加载后隐藏", @"自动回弹拉01", @"自动回弹拉02", @"自定义刷新控件(自动刷新

    1.6K51

    浅析RunLoop原理及其应用

    这个模式下滑动UITextView或停止时候RunLoop是UITRacking和default模式下切换(从打印日志中可以看出)。...tableview 加载 cell 时如果遇到多个耗时操作会有点卡顿。将耗时操作放到 DefaultMode 里只能解决滑动时流畅,但是停止时需要加载耗时,仍然会有卡顿感觉。...解决办法:每次RunLoop循环只加载一张图片 这样loop就会很快进入到BeforeWaiting处理后面的UI刷新(UITrackingRunLoopMode 优先处理)或者没有UI刷新事件继续处理下一张图片...所以这里可以再次优化,将模式改为kCFRunLoopCommonModes,这样的话滑动或者不滑动都可以加载图片渲染屏幕,而且是不影响屏幕流畅性基础。如以下GIF: ?...操作必须放在主线程,但是弊端就是太多图片处理会阻塞tableview滑动流畅性 for (int i = 1; i < 4; i++) { UIImageView *imageView

    95020

    【IOS开发进阶系列】社会化分享SDK专题

    :         授权回调页、取消授权回调页设置应用信息-->高级信息,具体位置参考下图:         安全域名修改需要二次审核通过才生效,授权回调页修改即时生效。...1.1.1.2 初始化SSO //新浪微博配置 //打开新浪微博SSO开关,设置新浪微博回调地址,这里必须要和你新浪微博后台设置回调地址一致。...,不绕过审核必须保证微信后台配置签名与您app签名一致,否则无法分享;         微信并无实际分享网络图片和分享bitmap功能,如果设置了网络图片,此图片会先下载会本地,之后再当作本地图片分享...注意:分享小程序目前只支持分享微信好友,分享小程序必须在sharesdk.xml文件中配置特殊参数,如下所示:userName是小程序原始ID,path是小程序内页面路径;而且必须保证微信开放平台与微信公众...http://www.jianshu.com/p/738ac2b8865d iOS 9学习系列:打通iOS 9通用链接(Universal Links) http://www.cocoachina.com

    21720

    探讨iOS 图片解压缩到渲染过程

    iOS设备双缓冲机制:显示系统通常会引入两个帧缓冲区,双缓冲机制 图片显示到屏幕是CPU与GPU协作完成 对应应用来说,图片是最占用手机内存资源,将一张图片从磁盘中加载出来,并最终显示到屏幕,中间其实经过了一系列复杂处理过程...二.图片加载工作流程 假设我们使用 +imageWithContentsOfFile: 方法从磁盘中加载一张图片,这个时候图片并没有解压缩; 然后将生成 UIImage 赋值给 UIImageView...; 将压缩图片数据解码成未压缩位图形式,这是一个非常耗时 CPU 操作; 最后 Core Animation 中CALayer使用未压缩位图数据渲染 UIImageView 图层。...(计算每个像素点最终显示颜色值) 从帧缓存区中渲染到屏幕 我们提到了图片解压缩是一个非常耗时 CPU 操作,并且默认是主线程中执行。...因此,也就有了业内解决方案,子线程提前对图片进行强制解压缩。 而强制解压缩原理就是对图片进行重新绘制,得到一张解压缩后位图。

    1.7K40

    iOS开发 - 图片解压缩到渲染过程

    iOS设备双缓冲机制:显示系统通常会引入两个帧缓冲区,双缓冲机制 图片显示到屏幕是CPU与GPU协作完成 对应应用来说,图片是最占用手机内存资源,将一张图片从磁盘中加载出来,并最终显示到屏幕,中间其实经过了一系列复杂处理过程...二.图片加载工作流程 假设我们使用 +imageWithContentsOfFile: 方法从磁盘中加载一张图片,这个时候图片并没有解压缩; 然后将生成 UIImage 赋值给 UIImageView...; * 将压缩图片数据解码成未压缩位图形式,这是一个非常耗时 CPU 操作; * 最后 `Core Animation` 中`CALayer`使用未压缩位图数据渲染 `UIImageView...) * 片元着色器计算(计算每个像素点最终显示颜色值) * 从帧缓存区中渲染到屏幕 我们提到了图片解压缩是一个非常耗时 CPU 操作,并且默认是主线程中执行。...因此,也就有了业内解决方案,子线程提前对图片进行强制解压缩。 而强制解压缩原理就是对图片进行重新绘制,得到一张解压缩后位图。

    1.7K00
    领券