Core Animation - 图层行为
2016-05-20 11:08
387 查看
前面我们是对Layer层进行的动画,现在我们对UIView关联的图层进行同样的动画,一样的代码会发现,对UIView关联的图层动画平滑过渡的效果消失了,颜色直接跳变,那也就是说UIKit直接禁止了隐式动画。
先说下隐式动画的实现原理:
当使用CALayer的属性时,图层首先检测它是否有委托并实现了CALayerDelegate中的actionForLayer:forKey方法。如果有委托的话,直接调用并返回结果。
当没有委托或者没有调用actionForLayer:forKey方法,图层接着检查包含属性名称对应行为映射的actions字典。
如果actions字典没有包含这个属性的话,就在style字典中接着搜索。
如果还是找不到对应的行为,就调用属性的默认行为-defaultActionForKey方法。
通过以上我们可以知道,actionForKey方法要么返回空,要么返回CALayer协议对应的对象,然后拿这个值和先前的值做比较。很明显在UIView图层找不到对应的方法,所以UIKit就这么禁用了隐式动画,画面出现了跳变现象。
在CALayer图层块中隐式动画如何关闭呢:
所以在UIView图层想要实现动画就是要使用UIView的动画函数,或者继承UIView,并覆盖-actionForLayer:forKey:方法,或者直接创建一个显示的动画。
下面对单独的一个图层进行操作,不使用隐式动画,通过给backgroundColor设置一个自定义的action字典,使用CATransaction的实例,来实现推进过度。
这里用了CATransition的另外两个属性,transition.type和transition.subtype,transition.type是动画的类型,这里为推动过度的,transition.subtype设置了动画推动的起始方向是从左边开始的。运行后会发现新的替换颜色是从左边推进的动画。
代码地址就不放了,还是原来的项目,增加两个属性就行了。
先说下隐式动画的实现原理:
当使用CALayer的属性时,图层首先检测它是否有委托并实现了CALayerDelegate中的actionForLayer:forKey方法。如果有委托的话,直接调用并返回结果。
当没有委托或者没有调用actionForLayer:forKey方法,图层接着检查包含属性名称对应行为映射的actions字典。
如果actions字典没有包含这个属性的话,就在style字典中接着搜索。
如果还是找不到对应的行为,就调用属性的默认行为-defaultActionForKey方法。
通过以上我们可以知道,actionForKey方法要么返回空,要么返回CALayer协议对应的对象,然后拿这个值和先前的值做比较。很明显在UIView图层找不到对应的方法,所以UIKit就这么禁用了隐式动画,画面出现了跳变现象。
在CALayer图层块中隐式动画如何关闭呢:
[CATransaction setDisableActions:YES];
所以在UIView图层想要实现动画就是要使用UIView的动画函数,或者继承UIView,并覆盖-actionForLayer:forKey:方法,或者直接创建一个显示的动画。
下面对单独的一个图层进行操作,不使用隐式动画,通过给backgroundColor设置一个自定义的action字典,使用CATransaction的实例,来实现推进过度。
- (void)viewDidLoad { [super viewDidLoad]; //create sublayer self.colorLayer = [CALayer layer]; self.colorLayer.frame = CGRectMake(50.0f, 50.0f, 100.0f, 100.0f); self.colorLayer.backgroundColor = [UIColor blueColor].CGColor; //add a custom action CATransition *transition = [CATransition animation]; transition.type = kCATransitionPush; transition.subtype = kCATransitionFromLeft; self.colorLayer.actions = @{@"backgroundColor": transition}; //add it to our view [self.layerView.layer addSublayer:self.colorLayer]; } - (void)changeColor { //randomize the layer background color CGFloat red = arc4random() / (CGFloat)INT_MAX; CGFloat green = arc4random() / (CGFloat)INT_MAX; CGFloat blue = arc4random() / (CGFloat)INT_MAX; self.colorLayer.backgroundColor = [UIColor colorWithRed:red green:green blue:blue alpha:1.0].CGColor]; }
这里用了CATransition的另外两个属性,transition.type和transition.subtype,transition.type是动画的类型,这里为推动过度的,transition.subtype设置了动画推动的起始方向是从左边开始的。运行后会发现新的替换颜色是从左边推进的动画。
代码地址就不放了,还是原来的项目,增加两个属性就行了。
相关文章推荐
- 最新版Webstorm 2016.1.2b破解方法
- [Android] SlidingDrawableTabLayout
- JAVA
- listview 刷新某一个item
- HDU 1080-Super Jumping! Jumping! Jumping!(LIS最长上升子序列-最大递增子段和)
- JavaScript 数组some()和filter()的用法及区别
- msp430单片机实现常按键和短按键加去抖功能
- LoadRunner 技巧之协议分析
- 巩固缓存相关,深入解析imageLoader
- fedora23 安装openssh-server
- 2.1 JobScheduler, Job, JobSet 详解
- Scrum 项目 6.0
- JAXB - Calling marshal
- 牛客网算法学习记录-排序2
- 手把手教你写框架之ShykyAnnotations - 注解
- Tomcat
- shell变量
- 半透明的actionbar的实现
- 父域与子域的帐户是否可以相互登陆
- Python查询本地外网IP实例