_viewAnimation = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
_viewAnimation.backgroundColor = [UIColor redColor];
[self.view addSubview:_viewAnimation];
CABasicAnimation *positionAnima = [CABasicAnimation animationWithKeyPath:@"position.y"];
positionAnima.duration = 0.8;
positionAnima.fromValue = @(self.viewAnimation.center.y);
positionAnima.toValue = @(self.viewAnimation.center.y+100);
positionAnima.removedOnCompletion = NO;
positionAnima.fillMode = kCAFillModeForwards;
[self.viewAnimation.layer addAnimation:positionAnima forKey:@"AnimationMoveY"];
一个简单的移动动画。
QQ20170303-140540@2x.png
QQ20170303-140342@2x.png
需要注意以下两个参数
-
fillMode
官方解释
大意:fillMode的作用就是决定当前对象过了非active时间段的行为. 比如动画开始之前,动画结束之后
kCAFillModeRemoved 这个是默认值,也就是说当动画开始前和动画结束后,动画对layer都没有影响,动画结束后,layer会恢复到之前的状态
kCAFillModeForwards 当动画结束后,layer会一直保持着动画最后的状态
kCAFillModeBackwards 这个和kCAFillModeForwards是相对的,就是在动画开始前,你只要将动画加入了一个layer,layer便立即进入动画的初始状态并等待动画开始.你可以这样设定测试代码,将一个动画加入一个layer的时候延迟5秒执行.然后就会发现在动画没有开始的时候,只要动画被加入了layer,layer便处于动画初始状态
kCAFillModeBoth 理解了上面两个,这个就很好理解了,这个其实就是上面两个的合成.动画加入后开始之前,layer便处于动画初始状态,动画结束后layer保持动画最后的状态.
- removedOnCompletion
QQ20170303-135848@2x.png
大意:当动画完成后自动变回原样
有了这两个参数之后,动画结束后view便保持结束状态,但是它的frame值并没有发生改变
开始的frame:(origin = (x = 100, y = 100), size = (width = 100, height = 100))
结束的frame:(origin = (x = 100, y = 100), size = (width = 100, height = 100))