- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
8.1 属性动画
属性动画
CAAnimationDelegate在任何头⽂件中都找不到,但是可以在CAAnimation头⽂
件或者苹果开发者⽂档中找到相关函数。在这个例 中,我们⽤-
animationDidStop:finished:⽅法在动画结束之后来更新图层的
backgroundColor。
当更新属性的时候,我们需要设置⼀个新的事务,并且禁⽤图层⾏为。否则动画会发
⽣两次,⼀个是因为显式的CABasicAnimation,另⼀次是因为隐式动画,具体实
现见订单8.3 。
清单8.3 动画完成之后修改图层的背景⾊
@implementation ViewController
- ( oid) iewDidLoad
{
[super iewDidLoad];
//create sublayer
self.colorLayer = [CALayer layer];
self.colorLayer.frame = CGRectMake(50.0f, 50.0f, 100.0f, 100.0
self.colorLayer.backgroundColor = [UIColor blueColor].CGColor;
//add it to our iew
[self.layerView .layer addSublayer:self.colorLayer];
}
- (IBAction)changeColor
{
//create a new random color
CGFloat red = arc4random() / (CGFloat)INT_MAX;
CGFloat green = arc4random() / (CGFloat)INT_MAX;
CGFloat blue = arc4random() / (CGFloat)INT_MAX;
UIColor *color = [UIColor colorWithRed:red green:green blue:bl
//create a basic animation
CABasicAnimation *animation = [CABasicAnimation animation];
animation.keyPath = @backgroundColor;
animation.toValue = (__bridge id)color.CGColor;
animation.delegate = self;
//apply animation to layer
[self.colorLayer addAnimation:animation forKey :nil];
}
- ( oid)animationDidStop:(CABasicAnimation *)anim finished:(BOOL)f
{
//set the backgroundColor property to match animation toValue
[CATransaction begin];
[CATransaction setDisableActions:YES];
self.colorLayer.backgroundColor = (__bridge CGColorRef)anim.to
[CATransaction commit];
}
@end
对CAAnimation⽽⾔,使⽤委托模式⽽不是⼀个完成块会带来⼀个问题,就是当你
有多个动画的时候,⽆法在在回调⽅法中区分。在⼀个视图控制器中创建动画的时
候,通常会⽤控制器本⾝作为⼀个委托 (如清单8.3所⽰),但是所有的动画都会调⽤
同⼀个回调⽅法,所以你就需要判断到底是那个图层的调⽤。
考虑⼀下第三章的闹钟,“ 图层⼏何学” ,我们通过简单地每秒更新指针的⾓度来实现
⼀个钟,但如果指针动态地转向新的位置会更加真实。
我们不能通过隐式动画来实现因为这些指针都是UIView的实例,所以图层的隐式动
画都被禁⽤了。我们可以简单地通过UIView的动画⽅法来实现。但如果想更好地控
制动画时间,使⽤显式动画会更好 (更多内容见第⼗章)。使
⽤CABasicAnimation来做动画可能会更加复杂,因为我们需要在-
animationDidStop:finished:中检测指针
文档评论(0)