首页 > 代码库 > 基本动画CABasicAnimation - 完成之后闪回初始状态

基本动画CABasicAnimation - 完成之后闪回初始状态

基本动画CABasicAnimation 结束之后,默认闪回初始状态,那怎么解决呢?

 

position需要设备两个属性:

1     // MARK: - 结束后不要闪回去
2     anim.removedOnCompletion = NO;
3     anim.fillMode = kCAFillModeForwards;

设置之后,不会再闪回去,但其实控件的位置并未改变,还在原来的位置,只是“显示层”挪到了新位置。

可以通过动画的代理方法来实现:

    // MARK: - 通过代理方法,修正按钮的位置!
    // 这个代理写在了NSObject的分类中,不需要尊守任何协议
    anim.delegate = self;

实现代理方法:

 1 #pragma mark - 核心动画的代理方法
 2 // 核心动画开始
 3 - (void)animationDidStart:(CAAnimation *)anim {
 4 
 5     NSLog(@"核心动画开始");
 6     
 7 }
 8 
 9 // 核心动画结束
10 - (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag {
11     
12 //    NSLog(@"核心动画结束!");
13     // 在核心动画结束后,将控件的真实位置挪过来!
14     _btn.center = CGPointMake(150, 500);
15     
16     // 将layer中的动画移除掉,保证不会闪了!
17     [_btn.layer removeAllAnimations];
18 }

 

如果是transform.scale,transform.rotation,只需要设置anim.removedOnCompletion = NO;即可

 

 

常见属性:

 1 CABasicAnimation *basicAnimation = [CABasicAnimation animationWithKeyPath:@"position.y"];
 2 
 3     basicAnimation.duration = 2;
 4     
 5     // 这三个属性同时最多只能设置2个
 6     basicAnimation.fromValue = http://www.mamicode.com/@100;
 7     basicAnimation.byValue = http://www.mamicode.com/@50;
 8     basicAnimation.toValue = http://www.mamicode.com/@500;
 9     
10     basicAnimation.repeatCount = CGFLOAT_MAX;
11     
12     basicAnimation.removedOnCompletion = NO;
13     basicAnimation.fillMode = kCAFillModeForwards;
14     
15     [_btn.layer addAnimation:basicAnimation forKey:nil];

 

基本动画CABasicAnimation - 完成之后闪回初始状态