关于动画的详细介绍,请看如下链接:
Core Animation1-简介
Core Animation2-CABasicAnimation
1. CABasicAnimation提供基本的动画
2. CAKeyframeAnimation可以添加多个动画路径
如下例子中实现了长按imageView的抖动效果
// 核心动画都是假象,不能改变layer的真实属性的值
// 展示的位置和实际的位置不同。实际位置永远在最开始位置
- (void)longPress:(UILongPressGestureRecognizer *)longPress
{
if (longPress.state == UIGestureRecognizerStateBegan) {
CAKeyframeAnimation *anim = [CAKeyframeAnimation animation];
anim.keyPath = @"transform.rotation";
anim.values = @[@(angle2radian(-5)),@(angle2radian(5)),@(angle2radian(-5))];
anim.repeatCount = MAXFLOAT;
anim.duration = 0.5;
[_imageView.layer addAnimation:anim forKey:nil];
}
}
3. 转场动画可以实现图片3D切换的效果
- (void)transitionAnimation
{
_index++;
if (_index == 4) {
_index = 1;
}
NSString *fileName = [NSString stringWithFormat:@"%d",_index];
_imageView.image = [UIImage imageNamed:fileName];
CATransition *anim = [CATransition animation];
anim.type = @"pageCurl";
anim.subtype = kCATransitionFromLeft;
// anim.startProgress = 0.5;
anim.duration = 2;
[_imageView.layer addAnimation:anim forKey:nil];
}
转场类型如下:
转场动画也可以用UIView封装的动画来完成,但是效果较少:
- (void)transitionByUIView
{
_index++;
if (_index == 4) {
_index = 1;
}
NSString *fileName = [NSString stringWithFormat:@"%d",_index];
_iamgeView.image = [UIImage imageNamed:fileName];
[UIView transitionWithView:self.view duration:0.5 options:UIViewAnimationOptionTransitionCurlUp animations:nil completion:nil];
}
4. 动画组
动画组可以组合很多个基本动画,并发同时执行:
- (void)animationGroup
{
CABasicAnimation *rotation = [CABasicAnimation animation];
rotation.keyPath = @"transform.rotation";
rotation.toValue = @M_PI_2;
CABasicAnimation *position = [CABasicAnimation animation];
position.keyPath = @"position";
position.toValue = [NSValue valueWithCGPoint:CGPointMake(100, 250)];
CABasicAnimation *scale = [CABasicAnimation animation];
scale.keyPath = @"transform.scale";
scale.toValue = @0.5;
CAAnimationGroup *group = [CAAnimationGroup animation];
group.animations = @[rotation,position,scale];
group.duration = 2;
// 取消反弹
group.removedOnCompletion = NO;
group.fillMode = kCAFillModeForwards;
[_redView.layer addAnimation:group forKey:nil];
}
需要注意的是,核心动画所改变的位置,仅仅是用于动画显示,并不会真正改变动画对象的真正状态.
所以CALayer的核心动画,大多用于转场,而其它地方不用
例如,移动一张图片,即使动画设置成不重置为初始状态(不反弹),移动后,图片的真正位置,依然是初始位置,而不是显示的位置