之一:CABasicAnimation - 基本动画
嗷嗚嗷嗚嗷嗚
1 // 將視圖作為屬性方便后面執行多個不同動畫 2 _myView = [[UIView alloc] init]; 3 _myView.layer.position = CGPointMake(100, 100); 4 _myView.layer.bounds = CGRectMake(0, 0, 100, 100); 5 _myView.backgroundColor = [UIColor blueColor]; 6 [self.view addSubview:_myView]; 7 [_myView release];?平移動畫(1)
1 // 創建一個CABasicAnimation類型的動畫對象并對CALayer的position屬性執行動畫 2 CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"position"]; 3 4 // 動畫持續1.5s 5 anim.duration = 1.5; 6 7 // position屬性值從(50, 80)漸變到(300, 350) 8 anim.fromValue = [NSValue valueWithCGPoint:CGPointMake(50, 80)]; 9 anim.toValue = [NSValue valueWithCGPoint:CGPointMake(300, 350)]; 10 11 // 設置動畫的代理 12 anim.delegate = self; 13 14 // 保持動畫執行后的狀態 15 anim.removedOnCompletion = NO; 16 anim.fillMode = kCAFillModeForwards; 17 18 // 添加動畫對象到myView的圖層上 19 [_myView.layer addAnimation:anim forKey:@"translate"];- 上面實現了平移動畫
- 想要實現不同的效果,最關鍵的地方就是第2行CABasicAnimation對象的初始化方法中keyPath的設定。必須是CALayer的某項屬性。
- 第8、9行這里的屬性接收的是id類型的參數所以不能直接使用CGPoint這種結構體類型,而是要先包裝成NSValue對象后再使用。
-
注意:可以嘗試將第9行的toValue換成byValue ?區別:前者是到指定的位置,后者是在當前的位置上增加多少。
- 默認情況下,動畫執行完畢后,動畫會自動從CALayer上移除,CALayer又會回到原來的狀態。為了保持動畫執行后的狀態,可以加入第15、16行代碼
fillMode的作用就是決定當前對象過了非active時間段的行為。比如動畫開始之前,動畫結束之后。如果是一個動畫CAAnimation,則需要將其removedOnCompletion設置為NO,要不然fillMode不起作用.
kCAFillModeRemoved?默認值 也就是說當動畫開始前和動畫結束后,動畫對layer都沒有影響,動畫結束后,layer會恢復到之前的狀態?
kCAFillModeForwards?當動畫結束后,layer會一直保持著動畫最后的狀態?
kCAFillModeBackwards?這個和kCAFillModeForwards是相對的,就是在動畫開始前,你只要將動畫加入了一個layer,layer便立即進入動畫的初始狀態并等待動畫開始.你可以這樣設定測試代碼,將一個動畫加入一個layer的時候延遲5秒執行.然后就會發現在動畫沒有開始的時候,只要動畫被加入了layer,layer便處于動畫初始狀態?
kCAFillModeBoth?理解了上面兩個,這個就很好理解了,這個其實就是上面兩個的合成.動畫加入后開始之前,layer便處于動畫初始狀態,動畫結束后layer保持動畫最后的狀態. - 第19行后面的@"translate"只是給動畫對象起了個名稱,也可以直接給個nil,但是為方便以后可以調用CALayer的removeAnimationForKey:方法根據動畫名稱來移除相應的動畫
- 第12行后面的self是視圖控制器。代理需要實現的方法:
運行后發現, 在實質上,圖層的屬性值還是動畫執行前的初始值,并沒有真正被改變。
1 // 移除動畫 2 [_myView.layer removeAnimationForKey:@"translate"]?
平移動畫(2)?
1 CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform"]; 2 anim.duration = 1; 3 4 CATransform3D form = CATransform3DMakeTranslation(350, 350, 0); 5 anim.toValue = [NSValue valueWithCATransform3D:form]; 6 7 [_myView.layer addAnimation:anim forKey:nil];- 通過CALayer的transform屬性實現平移動畫,layer會從自己的初始位置平移到(350, 350)位置
- 通過transform(KVC)的方式來進行設置,可以簡單實現3D效果的平移、縮放、旋轉效果。
- 可查看API文檔搜索CABasicAnimation animationWithKeyPath Types
縮放動畫(1)
1 CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"bounds"]; 2 anim.duration = 2; 3 4 anim.toValue = [NSValue valueWithCGRect:CGRectMake(0, 0, 30, 30)]; 5 6 [_myView.layer addAnimation:anim forKey:nil];通過CALayer的bounds屬性實現縮放動畫,layer會從原來的尺寸(100x100)變為30x30
縮放動畫(2)
1 CABasicAnimation *anim = [CABasicAnimation 2 animationWithKeyPath:@"transform"]; 3 anim.duration = 1.5; // 動畫持續1.5s 4 5 // CALayer的寬度從0.5倍變為2倍 6 // CALayer的高度從0.5倍變為1.5倍 7 anim.fromValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(0.5, 0.5, 1)]; 8 anim.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(2, 1.5, 1)]; 9 10 [_myView.layer addAnimation:anim forKey:nil];旋轉動畫
1 CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform"]; 2 anim.duration = 1.5; 3 4 // 繞著(1, 1, 0)這個向量軸順時針旋轉45° 5 anim.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI_4, 1, 1, 0)]; 6 7 [_myView.layer addAnimation:anim forKey:nil];-
提示:如果要僅需要圖形以2D的方式旋轉,只要把CATransform3DMakeRotation在z方向上的值改為1即可。
anima.toValue=[NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI_4, 1, 1, 0)];
- 通過以上可以發現其實可以不用設置fromValue,只設置了toValue
- CABasicAnimation雖然能夠做很多基本的動畫效果,但是有個局限性,只能讓CALayer的屬性從某個值漸變到另一個值,僅僅是在2個值之間漸變
?
轉載于:https://www.cnblogs.com/xs514521/p/5192378.html
總結
以上是生活随笔為你收集整理的之一:CABasicAnimation - 基本动画的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: struts2学习笔记--拦截器(Int
- 下一篇: EXC_BAD_ACCESS调试