基本动画CABasicAnimation 结束之后,默认闪回初始状态,那怎么解决呢?
position需要设备两个属性:
// MARK: - 结束后不要闪回去
anim.removedOnCompletion = NO;
anim.fillMode = kCAFillModeForwards;
设置之后,不会再闪回去,但其实控件的位置并未改变,还在原来的位置,只是“显示层”挪到了新位置。
可以通过动画的代理方法来实现:
// MARK: - 通过代理方法,修正按钮的位置!
// 这个代理写在了NSObject的分类中,不需要尊守任何协议
anim.delegate = self;
实现代理方法:
#pragma mark - 核心动画的代理方法
// 核心动画开始
- (void)animationDidStart:(CAAnimation *)anim { NSLog(@"核心动画开始"); } // 核心动画结束
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag { // NSLog(@"核心动画结束!");
// 在核心动画结束后,将控件的真实位置挪过来!
_btn.center = CGPointMake(, ); // 将layer中的动画移除掉,保证不会闪了!
[_btn.layer removeAllAnimations];
}
如果是transform.scale,transform.rotation,只需要设置anim.removedOnCompletion = NO;即可
常见属性:
CABasicAnimation *basicAnimation = [CABasicAnimation animationWithKeyPath:@"position.y"]; basicAnimation.duration = ; // 这三个属性同时最多只能设置2个
basicAnimation.fromValue = @;
basicAnimation.byValue = @;
basicAnimation.toValue = @; basicAnimation.repeatCount = CGFLOAT_MAX; basicAnimation.removedOnCompletion = NO;
basicAnimation.fillMode = kCAFillModeForwards; [_btn.layer addAnimation:basicAnimation forKey:nil];