標籤:
基本動畫,是CAPropertyAnimation的子類屬性說明:fromValue:keyPath相應屬性的初始值toValue:keyPath相應屬性的結束值動畫過程說明:隨著動畫的進行,在長度為duration的期間內,keyPath相應屬性的值從fromValue漸漸地變為toValuekeyPath內容是CALayer的可動畫Animatable屬性如果fillMode=kCAFillModeForwards同時removedOnComletion=NO,那麼在動畫執行完畢後,圖層會保持顯示動畫執行後的狀態。但在實質上,圖層的屬性值還是動畫執行前的初始值,並沒有真正被改變。 具體的示範執行個體如下:功能實現:點擊視圖中的按鈕,可以控制器動畫過程的恢複運行和運行停止,等到動畫運行到指定位置時,動畫就停在此處,不在返回原處。 操作步驟:1、拖一個按鈕控制項到故事板控制器的視圖中,名字為play/stop,然後關聯按鈕事件(改變按鈕的tag,調用播放或暫停方法)2、建立核心動畫子層並加到父核心動畫層中,然後再建立一個tap觸摸手勢,並對觸摸事件做處理(建立動畫的過程)3、完成之前定義的所有事件,同時實現動畫的協議。 具體的代碼如下://拖控制項,關聯事件 //在-(void)viewDidLoad{}方法中,建立子層,並添加到父層中
//建立子層 self.subLayer = [CALayer layer]; self.subLayer.bounds = CGRectMake(0, 0, 100, 100); self.subLayer.position = CGPointMake(100, 100); self.subLayer.backgroundColor = [[UIColor redColor]CGColor]; self.subLayer.cornerRadius = 50; [self.view.layer addSublayer:self.subLayer];
//在-(void)viewDidLoad{}方法中,建立手勢,添加手勢事件
//建立tap手勢 UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(Tap:)]; tap.numberOfTapsRequired = 1; tap.numberOfTouchesRequired = 1; [self.view addGestureRecognizer:tap];
//處理手勢事件,建立基本動畫
#pragma mark -tap手勢處理-(void)Tap:(UITapGestureRecognizer *)sender{ //擷取當前的點擊的位置 CGPoint location = [sender locationInView:self.view]; //建立基本動畫 CABasicAnimation *basicAnimation = [[CABasicAnimation alloc]init]; basicAnimation.duration = 5.0f;
//設定動畫改變的值為position basicAnimation.keyPath = @"position"; //BasicAnimation.fromValue用當前位置,不用設定 basicAnimation.toValue = [NSValue valueWithCGPoint:location]; //動畫執行完,停留下來,不返回原值,需要設定下面的兩個屬性 basicAnimation.removedOnCompletion = NO; basicAnimation.fillMode = kCAFillModeForwards; //設定代理 basicAnimation.delegate = self; //設定一個鍵區分動畫,將指定的動畫添加到子層中 [self.subLayer addAnimation:basicAnimation forKey:@"BasicAnimation"]; //沒有具體實現代理方法的情況下,subLayer雖然發生移動,但是它的真正位置並沒有發生改變 //NSLog(@"%@",NSStringFromCGPoint(self.subLayer.position));}//實現按鈕事件
- (IBAction)buttonClicked:(UIButton *)sender{ if (sender.tag == 0) { //動畫暫停 [self animationPause]; sender.tag = 1; } else { //動畫恢複 [self animationResume]; sender.tag = 0; }}//自訂動畫暫停方法
//動畫暫停-(void)animationPause{ //擷取當前暫停時間 //CFTimeInterval pauseTime = [self.subLayer convertTime:CACurrentMediaTime() fromLayer:nil]; CFTimeInterval pauseTime = CACurrentMediaTime(); //層的速度為0,停止動畫 self.subLayer.speed = 0; //儲存暫停時間,便於恢複 self.subLayer.timeOffset = pauseTime;}//自訂動畫恢複方法
//動畫恢複-(void)animationResume{ //擷取暫停時儲存的時間 CFTimeInterval pauseTime = self.subLayer.timeOffset; self.subLayer.timeOffset = 0; //設定速度 self.subLayer.speed = 1.0; //清除開始時間 self.subLayer.beginTime = 0.0; //計算開始時間 CFTimeInterval beginTime = [self.subLayer convertTime:CACurrentMediaTime() fromLayer:nil] - pauseTime; //重設開始時間 self.subLayer.beginTime = beginTime;}//實現動畫代理方法
#pragma mark -動畫代理的方法//動畫開始時觸發的方法-(void)animationDidStart:(CAAnimation *)anim{ //開始時的當前值 //NSLog(@"animationDisStart:%@",((CABasicAnimation *)anim).fromValue);}//動畫停止時觸發的方法-(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{ //停止時的終點值 //NSLog(@"animationDidStop,%@",((CABasicAnimation*)anim).toValue); //將subLayer的屬性值真正變為動畫停止時的屬性值 NSValue *toValue = ((CABasicAnimation*)anim).toValue; CGPoint point = [toValue CGPointValue]; self.subLayer.position = point;}@end//顯示的介面如下,(運行過程就不了,可以自己寫代碼驗證):
iOS:核心動畫之基本動畫CABasicAnimation