1.隱式動畫
1.1.什么是隱式動畫?
了解什么是隱式動畫之前,要先了解是什么根層和非根層.
根層:UIView內(nèi)部自動關(guān)聯(lián)著的那個layer我們稱它是根層.
非根層:手動創(chuàng)建的層,稱為非根層.
隱式動畫就是當(dāng)對非根層的部分屬性進(jìn)行修改時,它會子動的產(chǎn)生一些動畫的效果.我們稱這個默認(rèn)產(chǎn)生的動畫為隱式動畫.
1.2.如何取消隱式動畫?
先要了解動畫底層是怎么做的.動畫的底層是包裝成一個事務(wù)來進(jìn)行的.
1.3.什么是事務(wù)?
很多操作綁定在一起,當(dāng)這些操作執(zhí)行完畢后,才去執(zhí)行下一個操作.
開啟事務(wù)
[CATransaction begin];
設(shè)置事務(wù)沒有動畫
[CATransaction setDisableActions:YES];
設(shè)置動畫執(zhí)行的時間
[CATransaction setAnimationDuration:2];
提交事務(wù)
[CATransaction commit];
2.核心動畫(CAAnimation)
核心動畫之作用在層(CALayer)上.
動畫的本質(zhì)是改圖層的某個屬性.
CAAnimation的層級結(jié)構(gòu)
CAPropertyAnimation是CAAnimation的子類余爆,也是個抽象類纷宇,要想創(chuàng)建動畫對象,應(yīng)該使用它的兩個子類:CABasicAnimation和CAKeyframeAnimation
2.1.CABasicAnimation
屬性解析:
keyPath:通過指定CALayer的一個屬性名稱為keyPath(NSString類型)蛾方,并且對CALayer的這個屬性的值進(jìn)行修改像捶,達(dá)到相應(yīng)的動畫效果上陕。比如,指定@“position”為keyPath作岖,就修改CALayer的postition屬性的值唆垃,以達(dá)到平移的動畫效果五芝。
fromValue:keyPath相應(yīng)的屬性的初始值?
toValue:keyPath相應(yīng)屬性的結(jié)束值
隨著動畫的進(jìn)行痘儡,在長度為duration的持續(xù)時間內(nèi)枢步,keyPath相應(yīng)屬性的值從fromValue漸漸的變?yōu)閠oValue。如果fillMode=kCAFillModeForwards和removedOnComletion=NO矾瑰,那么在動畫執(zhí)行完畢后隘擎,圖層會保持顯示動畫執(zhí)行后的狀態(tài),但在實(shí)際上货葬,圖層的屬性值還是動畫執(zhí)行前的初始值,并沒有真正被改變休傍。
CABasicAnimation *anim = [CABasicAnimation animation];圖層有那些屬性,這里才能寫那些屬性.? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
anim.keyPath = @"transform.scale";
anim.toValue = @0.5;
告訴動畫完成的時候不要移除anim.removedOnCompletion = NO;保存動畫最前面的效果.
anim.fillMode = kCAFillModeForwards;把動畫添加到層上.
[_redView.layer addAnimation:anim forKey:nil];
2.2.幀動畫(CAKeyframeAnimation)
CAKeyframeAnimation蹲姐,CApropertyAnimation的子類,跟CABasicAnimation的區(qū)別是:CABasicAnimation只能從一個數(shù)值(fromValue)變到另一個數(shù)值(toValue)忙厌,而CAKeyframeAnimation會使用一個NSArray爆蔥這些數(shù)值
屬性解析:
values:就是上述的NSarray對象。里面的元素稱為“關(guān)鍵幀”(keyframe)慰毅。動畫對象會在指定的時間(duration)內(nèi)扎阶,依次顯示values數(shù)組中的每一個關(guān)鍵幀
path:可以設(shè)置一個CGPathRef/CGMutablePathRef,讓層跟著路徑移動东臀。path只對CALayer的anchorPoint和position起作用。如果你設(shè)置了path宰掉,那么values將被忽略
keyTimes:可以為對應(yīng)的關(guān)鍵幀指定對應(yīng)的時間點(diǎn),七取值范圍為0到1.0轨奄。keyTimes每一個時間值都對應(yīng)values中的每一幀。當(dāng)keyTimes沒有設(shè)置的時候挪拟,各個關(guān)鍵正的時間是平分的
CABasicAnimation可以看做是最多只有2個關(guān)鍵幀的CAkeyframeAnimation
2.3.動畫組(CAAnimationGroup)
CAAnimationGroup,CAAnimation的子類谎柄,可以保存一組動畫對象,將CAAnimationGroup對象加入層后朝巫,組中所有動畫對象可以同時并發(fā)運(yùn)行
屬性解析:
animations:用來保存一組動畫對象的NSArray石景,默認(rèn)情況下,一組動畫對象是同時運(yùn)行的揪荣,也可以通過設(shè)置動畫對象的beginTime屬性來更改動畫的開始時間
CAAnimationGroup *group = [CAAnimationGroup animation];
平移
CABasicAnimation *anim = [CABasicAnimation animation];anim.keyPath = @"position.y";
anim.toValue = @400;
縮放
CABasicAnimation *scaleAnim = [CABasicAnimation animation];scaleAnim.keyPath = @"transform.scale";
scaleAnim.toValue = @0.5;
設(shè)置動畫組屬性
group.animations = @[anim,scaleAnim];
group.removedOnCompletion = NO;
group.fillMode = kCAFillModeForwards;添加組動畫
[self.redView.layer addAnimation:group forKey:nil];
使用動畫組的好處,不需要每次都去添加動畫,設(shè)置動畫完成時的屬性.只需要把要執(zhí)行的動畫,添加到動畫組的animations數(shù)組當(dāng)中即可,最后把組動畫添加到層上,就會自動執(zhí)行數(shù)組當(dāng)中的動畫.動畫完成時設(shè)置的屬性也只需要設(shè)置一次.
2.4.轉(zhuǎn)場動畫(CATransition)
什么是轉(zhuǎn)場動畫?就是從 個場景轉(zhuǎn)換到另 個場景,像導(dǎo)航控制器的push效果,就是 個轉(zhuǎn)場.
CATransition恩商,CAAnimation的子類,用于做轉(zhuǎn)場動畫揽乱,能夠?yàn)閷犹峁┮瞥聊缓鸵迫肫聊坏膭赢嬓Ч?/i>
UINavigationController就是通過CATransition實(shí)現(xiàn)了將控制器的視圖推入屏幕的動畫效果
屬性解析:
type:動畫過渡類型
subtype:動畫過渡方向
startProgress:動畫起點(diǎn)(在整體動畫的百分比)
endProgress:動畫終點(diǎn)(在整體動畫的百分比)
創(chuàng)建轉(zhuǎn)場動畫
CATransition *anim = [CATransition animation];設(shè)置轉(zhuǎn)場類型
anim.type = @"cube";
anim.duration = 1;
設(shè)置轉(zhuǎn)場的 向
anim.subtype = kCATransitionFromLeft;設(shè)置動畫的開始位置
anim.startProgress = 0.5;
設(shè)置動畫的結(jié)束位置
anim.endProgress =0.8;
添加動畫.了
[_imageV.layer addAnimation:anim forKey:nil];
要執(zhí) 動畫的代碼稱為轉(zhuǎn)場代碼.轉(zhuǎn)場動畫要和轉(zhuǎn)場代碼寫在同 個 法當(dāng)中才有動畫效果.
3.UIView動畫
UIKit直接將動畫集成到UIKit類中粟矿,當(dāng)內(nèi)部的一些屬性發(fā)生改變時,UIView將為這些改變提供動畫支持
執(zhí)行動畫所想要的工作由UIView類自動完成撒犀,但仍要在希望執(zhí)行動畫時通知試圖為此需要將改變屬性的代碼放到[UIView beginAnimations:nil context:nil]和[UIView
?commiAnimations]之間