CATransaction事务
动画执行的时间取决于当前事务的设置,动画类型取决于图层行为
- begin 入栈([CATransaction setDisableActions:YES];)
- commit 出栈
- setAnimationDuration 设置当前事务的动画时间(默认0.25秒)
- setCompletionBlock 添加动画完成的代码块
[CATransaction begin];
[CATransaction setAnimationDuration:1.0];
[CATransaction setCompletionBlock:^{
CGAffineTransform transform = self.colorLayer.affineTransform;
transform = CGAffineTransformRotate(transform, M_PI_2);
self.colorLayer.affineTransform = transform;
}];
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;
[CATransaction commit];
- UIView关联的图层禁用了隐式动画,对图层做动画的唯一方法就是使用UIView的动画函数([UIView beginAnimations:nil context:nil];[UIView commitAnimations];)或者继承UIView,覆盖
-actionForLayer:forKey:
方法,或者使用显示动画。(可直接使用方法:+animateWithDuration:animations:)
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1];
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;
[UIView commitAnimations];
- 对于单独存在的图层,我们可以通过实现图层的
actionForLayer:forKey:
委托方法,或者提供一个actions
字典来控制隐式动画(CATransition推进过渡)
self.colorLayer = [CALayer layer];
self.colorLayer.frame = CGRectMake(50.0f, 50.0f, 100.0f, 100.0f);
self.colorLayer.backgroundColor = [UIColor blueColor].CGColor;
CATransition *transition = [CATransition animation];
transition.type = kCATransitionPush;
transition.subtype = kCATransitionFromLeft;
self.colorLayer.actions = @{@"backgroundColor": transition};
[self.layerView.layer addSublayer:self.colorLayer];
- 呈现图层 presentationLayer
呈现图层实际是对模型图层的复制,它的属性值代表任何指定时刻的当前外观效果,即你可以通过呈现图层的值来获取当前屏幕上真正显示的值
实现基于定时器的动画
,可以通过呈现图层获取某一时刻的图层位置
如果想让做动画的图层响应用户输入
,可以使用呈现图层调用-hitTest:
判断是否被点击