首页
学习
活动
专区
工具
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.

3.2K40
  • 【 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 动画图片数组 设置为

    4K40

    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 这个时候运行程序 序列帧动画已经开始执行了 效果如下 ?

    96910

    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

    92450

    iOS的GIF动画效果实现

    本文选自《iOS动画——核心技术与案例实战》 GIF在iOS中的使用场景 GIF在iOS中的使用场景有以下三个方面。 (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 根据图片名称配置 UIImageView 将 UIImageView 作为 subview 传给其他 view 但是实际上,我只需要...思考 上面这些代码的优势在于:类似 indicateView 这种东西,用一次就不要了,没必要引入新的名称,不便于理解和记忆,我们就可以函数式地把它解决掉,代码更精简易读。...特别是你用这种方式来给图片做滤镜处理的时候,一张图片先高斯模糊再打马赛克,先打马赛克再高斯模糊是完全不同的。

    51830

    在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

    【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

    23120

    浅析RunLoop原理及其应用

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

    97520

    探讨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
    领券