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