基本动画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 = @100; 7 basicAnimation.byValue = @50; 8 basicAnimation.toValue = @500; 9 10 basicAnimation.repeatCount = CGFLOAT_MAX; 11 12 basicAnimation.removedOnCompletion = NO; 13 basicAnimation.fillMode = kCAFillModeForwards; 14 15 [_btn.layer addAnimation:basicAnimation forKey:nil];
时间: 2024-10-14 12:09:21