如何取消 UIView 动画?
最近项目中有一个需求是需要手动点击相机对焦,这里由于相机对焦部分需要一个类似于系统对焦框一样的缩放动画,同时动画时长为0.3秒,因此这里就有一个很普遍的需求,如果用户在0.3秒内继续点击对焦会怎么样?
动画部分代码很简单,如下:
self.transform = CGAffineTransformMakeScale(2.0f, 2.0f);
[UIView animateWithDuration:0.3f delay:0.0f options:UIViewAnimationOptionCurveLinear
animations:^{
self.transform = CGAffineTransformIdentity;
}
completion:^(BOOL finished){
if (finished) {
[self hideFocus];
}
}];
对焦框在0.3秒内进行两倍缩小到正常尺寸的一个动画,之后隐藏。
旧代码分析
以前的代码在这部分的处理大致是这样的,
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(touchFocus:) object:_touches];
UITouch *touch = [_touches anyObject];
CGPoint touchPoint = [touch locationInView:self.view];
[self performSelector:@selector(touchFocus:) withObject: touches afterDelay:0.3f];
- (void)touchFocus:(NSSet *)touches {
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(touchFocus:) object:touches];
// 以下为具体对焦框显示部分
...
}
可以看出,代码逻辑大致为,截获屏幕点击事件,之后加入一个0.3秒的延时方法,如果用户0.3秒内再次点击对焦,则取消上一次的对焦事件;否则,执行对焦框动画。
这个逻辑看似解决了用户快速点击对焦的问题,实际上如果用户真正快速点击屏幕时,会出现一个很奇怪的现象,就是对焦框始终存在,并且不会变换位置,等到停止点击屏幕后,对焦框才会响应最新的触控位置进行动画,另一个问题就是对焦始终存在迟滞感,因为点击屏幕后需要等待0.3秒才能看到动画。
解决方案
那么有什么更好的办法呢?系统难道没有提供终止动画的接口嘛?当然不是,其实只需要在用户再次点击屏幕时候调用[_focusView.layer removeAllAnimations];
即可,其中具体的 view 为正在做动画的 view。
这样做还有另外一个好处,再也不需要烦人的滞后感了,屏幕对焦始终跟手,同时直接终止动画,里面的 completion 都会照常调用,不存在副作用,很好地解决了这个问题。
新引入问题
最近遇到了一个新引入的问题,发现对焦框无法隐藏,经过调查,问题出在这里:
if (finished) {
[self hideFocus];
}
如果是直接使用removeAllAnimations
接口停止动画的话,此处的finished
参数有可能返回 NO,导致这段代码产生问题,所以这里如果中止动画,则需要重新进行判定。
总结
- 学会了
removeAllAnimations
接口用法
尽管这个是很基础的系统 API 调用,但是我之前一直都不知道,在此记录下来,希望能给予其他人些许帮助。
如何取消 UIView 动画?的更多相关文章
- iOS XIB使用中适配iPhoneX的安全区域、调用UiView动画
2.调用UiView动画 WeakSelf; self.detailsViewBom.constant += 230; [UIView animateWithDuration:animotiontim ...
- 转一篇简洁的UIView动画编程方法
iOS 中的 UIView 动画编程其实还是很简单的,像 CSS3 一样,在给定的时间内完成状态连续性的变化呈现.比如背景色,Frame 大小,位移.翻转,特明度等. 以前我使用的编程方式都是用下面 ...
- UIView动画
UIView动画 一.commitAnimations方式使用UIView动画 1.commitAnimations方式使用UIView动画 [UIView beginAnimations:@&quo ...
- UIView动画效果
做出UI界面,实现程序功能,是重中之重,但是通过动画提升使用体验,一般人应该不会拒绝吧. 那么问题又来了,怎么做? 一: 稳扎稳打: 一步一步来吧,毕竟,心急吃不了热豆腐. 1.开启一个动画 2,设置 ...
- 核心动画和UIView动画的区别
核心动画和UIView动画的区别 1.核心动画制作用在Layer 2.核心动画的修改的属性都是假象,他的真实位置没有发生变化()
- 个人学习对UIView动画的总结
我的博客之前已经开通五个月了,但是一直没有写东西.一是不敢写,二是也不知道写啥.毕竟是一个刚刚入行大半年的菜鸟,现在总想通过各种办法提高自己.之前总感觉用到一些东西,只是当时搞懂了一点,加上并没有总结 ...
- UIView动画学习笔记
UIView的动画是通过修改控件的属性来达到动画的效果,如:渐变, 移动. 废话不多说,直接上代码: - (void)loadView{ [super loadView]; _leftView = [ ...
- iOS动画篇:UIView动画
iOS的动画效果一直都很棒很,给人的感觉就是很炫酷很流畅,起到增强用户体验的作用.在APP开发中实现动画效果有很多种方式,对于简单的应用场景,我们可以使用UIKit提供的动画来实现. UIView动画 ...
- iOS之UIview动画
一.UIView动画(首尾) 1.简单说明 UIKit直接将动画集成到UIView类中,当内部的一些属性发生改变时,UIView将为这些改变提供动画支持 执行动画所需要的工作由UIView类自动完成, ...
随机推荐
- ajax、axios、fetch区别及优缺点
将jQuery的ajax.axios和fetch做个简单的比较,所谓仁者见仁智者见智,最终使用哪个还是自行斟酌 1.jQuery ajax $.ajax({ type: 'POST', url: ur ...
- Java线程--CompletionService使用
原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11871911.html Java线程--CompletionService使用 public ...
- shell——eval exec
eval # cat test.sh echo \$$# eval "echo \$$#" # sh test.sh a b c $3 c shell的内建命令exec将并不启动新 ...
- python官网导航翻译
- 03.python语法入门--注释、变量
注释 """多行注释加在整个py文件的开头用来对该py文件进行一个整体性的说明通常一个py中只有一个多行注释"""# 这是一行贼溜的代码p ...
- php 利用 fsockopen GET/POST 提交表单及上传文件
1.GET get.php <?php$host = 'demo.fdipzone.com';$port = 80;$errno = '';$errstr = '';$timeout = 30; ...
- Spring Boot内置Tomcat
Spring Boot默认支持Tomcat/Jetty/Undertow作为底层容器.在之前实战相关的文章中,可以看到引入spring-boot-starter-web就默认使用tomcat容器,这是 ...
- Netty源码解析一——线程池模型之线程池NioEventLoopGroup
本文基础是需要有Netty的使用经验,如果没有编码经验,可以参考官网给的例子:https://netty.io/wiki/user-guide-for-4.x.html.另外本文也是针对的是Netty ...
- Devops 开发运维高级篇之微服务代码上传和代码检查
Devops 开发运维高级篇之微服务代码上传和代码检查 微服务持续集成(1)-项目代码上传到Gitlab 微服务持续集成(2)-从Gitlab拉取项目源码 微服务持续集成(3)-提交到SonarQub ...
- Django框架表关系外键-多对多外键(增删改查)-正反向的概率-多表查询(子查询与联表查询)
目录 一:表关系外键 1.提前创建表关系 2.目前只剩 书籍表和 书籍作者表没创建信息. 3.增 4.删 5.修改 二:多对多外键增删改查 1.给书籍绑定作者 2.删 3.修改 4.清空 三:正反向的 ...