iOS开发CoreAnimation解读之五——高级动画技巧 一、事务类 CoreAnimation中还有一个非常重要的类:CATransaction事物类,这个可以同时设置多个layer 二、CATransaction属性 对layer层的属性操作,都会形成隐式动画,要使用隐式动画,需要关闭layer层的animation动画属性,使用下面的方法: //关闭animation 动画效果,开启隐式动画 + (BOOL)disableActions; + (void)setDisableActions:(BOOL)flag; CATransaction用类方式通过设置key-value begin]; [CATransaction setValue:@1 forKey:kCATransactionAnimationDuration]; layer.backgroundColor = [UIColor blueColor].CGColor; [CATransaction commit]; 专注技术,热爱生活,交流技术,也做朋友。
NSTextAlignmentCenter; [self addSubview:self.progressLabel]; } - (void)updateProgress:(CGFloat)progress { [CATransaction begin]; [CATransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn ]]; [CATransaction setAnimationDuration:0.5]; self.progressLayer.strokeEnd = progress / 100.0 ; [CATransaction commit]; self.progressLabel.text = [NSString stringWithFormat:@"%.0f",progress
事务是通过CATransaction类来做管理,它没有属性或者实例方法,而且也不能通过alloc和init去创建它,它的常用操作如下: //1.动画属性的入栈 + (void)begin; //2.动画属性出栈 现在,我们就通过事务来设置动画做一个验证,代码如下: - (IBAction)changeColor:(UIButton *)sender{ [CATransaction begin]; // 入栈 //1.设置动画执行时间 [CATransaction setAnimationDuration:3]; //2.设置动画执行完毕后的操作:颜色渐变之后再旋转90度 [CATransaction setCompletionBlock:^{ CGAffineTransform transform = self.colorLayer.affineTransform + (void)setDisableActions:(BOOL)flag; UIView关联的图层禁用了隐式动画,那么对这种图层做动画的方法有有了以下几种方式: 使用UIView的动画函数(而不是依赖CATransaction
可以通过动画事务 (CATransaction) 关闭默认的隐式动画效果. 代码参考如下 : [CATransaction begin]; [CATransaction setDisableActions:YES]; // your code … [CATransaction commit]; UIView和CALayer的选择. ) [CATransaction begin]; [CATransaction setDisableActions:YES]; //your code …e.g.: self.myview.layer.position = CGPointMake(10, 10); [CATransaction commit]; 3D放射形变属性(和view的transform用法一样,也有make和非make方法) @property
CATransaction事务类 CATransaction事务类可以对多个layer的属性同时进行修改,它分隐式事务,和显式事务。 0.0 CATransaction.commit() 使用事务的主要原因之一是在显式事务的范围内,我们可以更改持续时间,计时功能和其他参数。 CATransaction.begin() CATransaction.setValue(8.0, forKey: "animationDuration") //执行动画 CATransaction.commit 嵌套显式事务代码 //事务嵌套 CATransaction.begin() // 外部transaction CATransaction.setValue(2.0, forKey: "animationDuration ") layer.position = CGPoint(x: 140, y: 140) CATransaction.begin() // 内部transaction CATransaction.setValue
); 38 self.layer.backgroundColor=[UIColor yellowColor].CGColor; 39 } 40 @end 效果: 关闭隐式动画: 1 [CATransaction begin]; 2 [CATransaction setDisableActions:YES]; 3 //隐式动画 4 self.layer.bounds=CGRectMake(0, 0, 200, 60); 5 self.layer.backgroundColor=[UIColor yellowColor].CGColor; 6 [CATransaction commit]; 3.如何查看CALayer
解决问题 1、在IJKSDLGLView.m文件中,- (BOOL)setupEAGLContext:(EAGLContext *)context 方法中添加代码: [CATransaction flush 2、在- (void)displayInternal: (SDL_VoutOverlay *) overlay 方法中也添加代码: [CATransaction flush]; ?
修改这个属性会产生平移动画 3.2 关闭隐式动画 可以通过动画事务(CATransaction)关闭默认的隐式动画效果 关闭或者修改隐式动画的步骤: 开启动画事物 关闭动画效果或者修改动画事件 设置动画完成后的动作 (可以不设置) 修改属性 提交 //开启 [CATransaction begin]; //关闭动画 [CATransaction setDisableActions:YES]; //修改属性 self.myview.layer.position = CGPointMake(10, 10); //提交 [CATransaction commit]; 宝贝儿们,我错了。
因此我们自己开启事务,并在事物中设置没有动画就会隐藏动画了 //开启事务 [CATransaction begin]; //设置事务没有动画 [CATransaction setDisableActions :YES]; //设置动画执行的时长 [CATransaction setAnimationDuration:2]; //这其中修改属性就没有动画了 //提交事务 [CATransaction
知道原因就好办了,我们可以通过 CATransaction显式的关闭他的动画,恢复成0,再打开动画,是不是就行了?哈哈哈,就是这么简单。 [CATransaction begin]; [CATransaction setDisableActions:YES]; self.layer.strokeEnd = 0; [CATransaction setDisableActions:NO]; [CATransaction commit]; ---- 坑填完了,看截图你们也知道老司机是熬夜给你们码字的吧,是时候点波赞?
2、返回的图片被分配给UIImageView 3、接着一个隐式的 CATransaction 捕获到了图层树的变化; 4、在主线程的下一个 run loop到来时,Core Animation 提交了这个隐式的事务 大都走的是 CATransaction 的隐式事务自己更新 if (!hasContentsRect && _curImageHasContentsRect) { if (! CGRectEqualToRect(self.layer.contentsRect, CGRectMake(0, 0, 1, 1)) ) { [CATransaction begin ]; [CATransaction setDisableActions:YES]; self.layer.contentsRect = CGRectMake (0, 0, 1, 1); [CATransaction commit]; } } _curImageHasContentsRect = hasContentsRect
事务是通过CATransaction类来做管理,CATransaction没有属性或者实例方法,并且也不能用+alloc和-init方法创建它。 使用CATransaction控制动画时间 - (IBAction)changeColor { //begin a new transaction [CATransaction begin UIView有两个方法,+beginAnimations:context:和+commitAnimations,和CATransaction的+begin和+commit方法类似。 如果在清单7.2的[CATransaction begin]之后添加下面的代码,同样也会阻止动画的发生: [CATransaction setDisableActions:YES]; 总结一下,我们知道了如下几点 [CATransaction commit]; } } 总结: 这一章讨论了隐式动画,还有Core Animation对指定属性选择合适的动画行为的机制。
//开启事务 [CATransaction begin]; //设置事务没有动画 [CATransaction setDisableActions:YES]; //设置动画执行的时长 [CATransaction setAnimationDuration:2]; //提交事务 [CATransaction commit]; 10、时钟效果 10.1 搭建界面 界面上时针、分针、秒针不需要与用户进行交互
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag { //核心动画事物,必须要在事物中进行 [CATransaction begin]; [CATransaction setCompletionBlock:^{ //UIViewAnimationOptionTransitionCrossDissolve是指旧视图溶解消失显示下一个新视图的效果 不然爱心会一直停留在屏幕上 [self removeFromSuperview]; } }]; }]; [CATransaction
四、YYTransaction YYTransaction 貌似和系统的 CATransaction 很像,他们同为“事务”,但实际上很不一样。 通过 CATransaction 的嵌套用法猜测 CATransaction 对任务的管理是使用的一个栈结构,而 YYTransaction 是使用的集合来管理任务。 true, // repeat 0xFFFFFF, // after CATransaction 而该 oberver 的优先级是 0xFFFFFF,优先级在 CATransaction 的后面(至于 CATransaction 的优先级为什么是 2000000,应该在主线程 RunLoop 启动的源代码中可以查到
/// CATiledLayer为载入大图造成的性能问题提供了一个解决方案 https://www.jianshu.com/p/ee0628629f92 import QuartzCore.CATransaction /// CATransaction是 Core Animation 中的事务类 https://www.jianshu.com/p/5e02a8a56cc5 import
1、加载和解压 一般使用imageNamed:或者imageWithData:从内存中加载图片生成UIImage的实例,此刻图片并不会解压,当 RunLoop 准备处理图片显示的事务(CATransaction CGRectEqualToRect(self.layer.contentsRect, CGRectMake(0, 0, 1, 1)) ) { [CATransaction begin ]; [CATransaction setDisableActions:YES]; self.layer.contentsRect = CGRectMake (0, 0, 1, 1); [CATransaction commit]; } } _curImageHasContentsRect = hasContentsRect setNeedsDisplay]; [self didMoved]; } 值得提出的是,1 中归位self.layer.contentsRect为CGRectMake(0, 0, 1, 1)使用了CATransaction
animation.completionClosure = completion if let layerAnimations = animations { CATransaction.begin () CATransaction.setDisableActions(true) layerAnimations() CATransaction.commit() } animationGroup = groupAnimationsForDifferences(oldLayer
动画(属性动画、关键帧动画等) import QuartzCore.CABase import QuartzCore.CAAnimation // 几何变换相关 import QuartzCore.CATransaction
假设我们使用 +imageWithContentsOfFile: 方法从磁盘中加载一张图片,这个时候的图片并没有解压缩; 然后将生成的 UIImage 赋值给 UIImageView ; 接着一个隐式的 CATransaction