隐式动画&显式动画 学习笔记
2018-01-21 本文已影响141人
嗯哎嘶唠咯
隐式动画
-
CALayer
的属性基本上都可以进行隐式动画 -
CATransaction
可以控制隐式动画(执行时间或者关闭隐式动画) -
UIView
将它关联的图层的这个特性关闭而没有动画 -
两个重要的方法:
- (instancetype)presentationLayer
- (instancetype)modelLayer
显式动画
属性动画
CAAnimation
实现了KVC协议,可以通过 -setValue:forKey:
和 -valueForKey:
方法存取属性。但是CAAnimation
如同NSDictionary
可以随意设置键值,so,在有多重动画需要在代理方法中做区分的时候,会显得格外方便:
...
CABasicAnimation *animation = [CABasicAnimation animation];
[self updateHandsAnimated:NO];
animation.keyPath = @"transform";
animation.toValue = [NSValue valueWithCATransform3D:transform];
animation.duration = 0.5;
animation.delegate = self;
[animation setValue:handView forKey:@"handView"];
[handView.layer addAnimation:animation forKey:nil];
...
- (void)animationDidStop:(CABasicAnimation *)anim finished:(BOOL)flag
{
//set final position for hand view
UIView *handView = [anim valueForKey:@"handView"];
handView.layer.transform = [anim.toValue CATransform3DValue];
}
关键帧动画
CAKeyframeAnimation
因为有个path
属性,so~可以配合贝塞尔曲线实现一些复杂的动画。
虚拟属性
CALayer
没有显式提供角度或者方向之类的属性,为了旋转图层,我们可以对transform.rotation
关键路径应用动画,而不是transform
本身。
- (void)viewDidLoad
{
[super viewDidLoad];
//add the ship
CALayer *shipLayer = [CALayer layer];
shipLayer.frame = CGRectMake(0, 0, 128, 128);
shipLayer.position = CGPointMake(150, 150);
shipLayer.contents = (__bridge id)[UIImage imageNamed: @"Ship.png"].CGImage;
[self.containerView.layer addSublayer:shipLayer];
//animate the ship rotation
CABasicAnimation *animation = [CABasicAnimation animation];
animation.keyPath = @"transform.rotation";
animation.duration = 2.0;
animation.byValue = @(M_PI * 2);
[shipLayer addAnimation:animation forKey:nil];
}
动画组
CABasicAnimation
和CAKeyframeAnimation
仅仅作用于单独的属性,而CAAnimationGroup
可以把这些动画组合在一起
过度
CATransition
CATransition
是另一个CAAnimation
的子类,和别的子类不同,CATransition
有一个type
和subtype
来标识变换效果。
- (IBAction)switchImage
{
//set up crossfade transition
CATransition *transition = [CATransition animation];
transition.type = kCATransitionFade;
//apply transition to imageview backing layer
[self.imageView.layer addAnimation:transition forKey:nil];
//cycle to next image
UIImage *currentImage = self.imageView.image;
NSUInteger index = [self.images indexOfObject:currentImage];
index = (index + 1) % [self.images count];
self.imageView.image = self.images[index];
}
ps:做转场动画时,可能会经常使用。
动画过程中取消动画
- (void)removeAnimationForKey:(NSString *)key;
- (void)removeAllAnimations;
小结
basicAnimation
和 keyAnimation
均作用与单一属性(毕竟都是propertyAnimation
的子类),animationGroup
可以多个动画组合。
过渡不同于属性动画,适用场景:视图移除添加和控制器转场。