基本動畫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];
