IOS動畫(Core Animation)總結(jié) (參考多方文章)(轉(zhuǎn))

一、簡介
iOS 動畫主要是指Core Animation框架酥泛。官方使用文檔地址為:Core Animation Guide豫尽。Core Animation是IOS和OS X平臺上負責圖形渲染與動畫的基礎(chǔ)框架老翘。Core Animation可以作用與動畫視圖或者其他可視元素缅叠,為你完成了動畫所需的大部分繪幀工作。你只需要配置少量的動畫參數(shù)(如開始點的位置和結(jié)束點的位置)即可使用Core Animation的動畫效果臀脏。Core Animation將大部分實際的繪圖任務(wù)交給了圖形硬件來處理劝堪,圖形硬件會加速圖形渲染的速度。這種自動化的圖形加速技術(shù)讓動畫擁有更高的幀率并且顯示效果更加平滑谁榜,不會加重CPU的負擔而影響程序的運行速度幅聘。
二、Core Animation類圖以及常用字段
Core Animation類的繼承關(guān)系圖![](http://upload-images.jianshu.io/upload_images/1663804-9a94cb409695222a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
常用屬性duration : 動畫的持續(xù)時間beginTime : 動畫的開始時間repeatCount : 動畫的重復次數(shù)autoreverses : 執(zhí)行的動畫按照原動畫返回執(zhí)行timingFunction : 控制動畫的顯示節(jié)奏系統(tǒng)提供五種值選擇窃植,分別是:
kCAMediaTimingFunctionLinear 線性動畫kCAMediaTimingFunctionEaseIn 先慢后快(慢進快出)kCAMediaTimingFunctionEaseOut 先塊后慢(快進慢出)kCAMediaTimingFunctionEaseInEaseOut 先慢后快再慢kCAMediaTimingFunctionDefault 默認帝蒿,也屬于中間比較快delegate : 動畫代理。能夠檢測動畫的執(zhí)行和結(jié)束巷怜。
?
1
2
3
4

<code
class
=
"hljs objectivec has-numbering"

<span
class
=
"hljs-class"
<span
class
=
"hljs-keyword"

@interface
</span> <span
class
=
"hljs-title"

NSObject</span> (<span
class
=
"hljs-title"
CAAnimationDelegate</span>)</span>

  • (<span
    class
    =
    "hljs-keyword"

void
</span>)animationDidStart:(CAAnimation *)anim;

  • (<span
    class
    =
    "hljs-keyword"

void
</span>)animationDidStop:(CAAnimation *)anim finished:(<span
class
=
"hljs-built_in"

BOOL</span>)flag;

<span
class
=
"hljs-keyword"

@end
</span></code>

path:關(guān)鍵幀動畫中的執(zhí)行路徑type : 過渡動畫的動畫類型葛超,系統(tǒng)提供了四種過渡動畫。- kCATransitionFade 漸變效果- kCATransitionMoveIn 進入覆蓋效果- kCATransitionPush 推出效果- kCATransitionReveal 揭露離開效果subtype : 過渡動畫的動畫方向- kCATransitionFromRight 從右側(cè)進入- kCATransitionFromLeft 從左側(cè)進入- kCATransitionFromTop 從頂部進入- kCATransitionFromBottom 從底部進入
三延塑、IOS動畫的調(diào)用方式
第一種:UIView 代碼塊調(diào)用
?
1
2
3
4
5
6

<code
class
=
"hljs avrasm has-numbering"

_demoView<span
class
=
"hljs-preprocessor"
.frame</span> = CGRectMake(<span
class
=
"hljs-number"

0
</span>, SCREEN_HEIGHT/<span
class
=
"hljs-number"

2
</span>-<span
class
=
"hljs-number"

50
</span>, <span
class
=
"hljs-number"

50
</span>, <span
class
=
"hljs-number"

50
</span>)<span
class
=
"hljs-comment"

;</span>

[UIView animateWithDuration:<span
class
=
"hljs-number"

1.0
</span>f animations:^{

_demoView<span
class
=
"hljs-preprocessor"

.frame</span> = CGRectMake(SCREEN_WIDTH, SCREEN_HEIGHT/<span
class
=
"hljs-number"

2
</span>-<span
class
=
"hljs-number"

50
</span>, <span
class
=
"hljs-number"

50
</span>, <span
class
=
"hljs-number"

50
</span>)<span
class
=
"hljs-comment"

;</span>

} completion:^(BOOL finished) {

_demoView<span
class
=
"hljs-preprocessor"

.frame</span> = CGRectMake(SCREEN_WIDTH/<span
class
=
"hljs-number"

2
</span>-<span
class
=
"hljs-number"

25
</span>, SCREEN_HEIGHT/<span
class
=
"hljs-number"

2
</span>-<span
class
=
"hljs-number"

50
</span>, <span
class
=
"hljs-number"

50
</span>, <span
class
=
"hljs-number"

50
</span>)<span
class
=
"hljs-comment"

;</span>

}]<span
class
=
"hljs-comment"

;</span></code>

第二種:UIView [begin commit]模式
?
1
2
3
4
5
6

<code>_demoView.frame = CGRectMake(
0
, SCREEN_HEIGHT/
2

50
,
50
,
50
);

[UIView beginAnimations:nil context:nil];

[UIView setAnimationDuration:
1
.0f];

_demoView.frame = CGRectMake(SCREEN_WIDTH, SCREEN_HEIGHT/
2

50
,
50
,
50
);

[UIView commitAnimations];

</code>

第三種:使用Core Animation中的類
?
1
2
3
4
5

<code
class
=
"hljs avrasm has-numbering"

CABasicAnimation *anima = [CABasicAnimation animationWithKeyPath:@<span
class
=
"hljs-string"

"position"
</span>]<span
class
=
"hljs-comment"

;</span>

anima<span
class
=
"hljs-preprocessor"

.fromValue</span> = [NSValue valueWithCGPoint:CGPointMake(<span
class
=
"hljs-number"

0
</span>, SCREEN_HEIGHT/<span
class
=
"hljs-number"

2
</span>-<span
class
=
"hljs-number"

75
</span>)]<span
class
=
"hljs-comment"

;</span>

anima<span
class
=
"hljs-preprocessor"

.toValue</span> = [NSValue valueWithCGPoint:CGPointMake(SCREEN_WIDTH, SCREEN_HEIGHT/<span
class
=
"hljs-number"

2
</span>-<span
class
=
"hljs-number"

75
</span>)]<span
class
=
"hljs-comment"

;</span>

anima<span
class
=
"hljs-preprocessor"

.duration</span> = <span
class
=
"hljs-number"

1.0
</span>f<span
class
=
"hljs-comment"

;</span>

[_demoView<span
class
=
"hljs-preprocessor"

.layer</span> addAnimation:anima forKey:@<span
class
=
"hljs-string"

"positionAnimation"
</span>]<span
class
=
"hljs-comment"

;</span></code>

四绣张、IOS動畫的使用
4.1:基礎(chǔ)動畫(CABaseAnimation)
重要屬性fromValue : keyPath對應(yīng)的初始值toValue : keyPath對應(yīng)的結(jié)束值基礎(chǔ)動畫主要提供了對于CALayer對象中的可變屬性進行簡單動畫的操作。比如:位移关带、透明度侥涵、縮放、旋轉(zhuǎn)宋雏、背景色等等芜飘。效果演示:![](http://upload-images.jianshu.io/upload_images/1663804-52bc0645f8dabbeb.gif?imageMogr2/auto-orient/strip)位移動畫代碼演示:
?
1
2
3
4
5
6
7
8

<code
class
=
"hljs avrasm has-numbering"

//使用CABasicAnimation創(chuàng)建基礎(chǔ)動畫

CABasicAnimation *anima = [CABasicAnimation animationWithKeyPath:@<span
class
=
"hljs-string"

"position"
</span>]<span
class
=
"hljs-comment"

;</span>

anima<span
class
=
"hljs-preprocessor"

.fromValue</span> = [NSValue valueWithCGPoint:CGPointMake(<span
class
=
"hljs-number"

0
</span>, SCREEN_HEIGHT/<span
class
=
"hljs-number"

2
</span>-<span
class
=
"hljs-number"

75
</span>)]<span
class
=
"hljs-comment"

;</span>

anima<span
class
=
"hljs-preprocessor"

.toValue</span> = [NSValue valueWithCGPoint:CGPointMake(SCREEN_WIDTH, SCREEN_HEIGHT/<span
class
=
"hljs-number"

2
</span>-<span
class
=
"hljs-number"

75
</span>)]<span
class
=
"hljs-comment"

;</span>

anima<span
class
=
"hljs-preprocessor"

.duration</span> = <span
class
=
"hljs-number"

1.0
</span>f<span
class
=
"hljs-comment"

;</span>

//anima<span class="hljs-preprocessor">.fillMode</span> = kCAFillModeForwards<span class="hljs-comment">;</span>

//anima<span class="hljs-preprocessor">.removedOnCompletion</span> = NO<span class="hljs-comment">;</span>

[_demoView<span
class
=
"hljs-preprocessor"

.layer</span> addAnimation:anima forKey:@<span
class
=
"hljs-string"

"positionAnimation"
</span>]<span
class
=
"hljs-comment"

;</span></code>

注意點如果fillMode=kCAFillModeForwards和removedOnComletion=NO,那么在動畫執(zhí)行完畢后磨总,圖層會保持顯示動畫執(zhí)行后的狀態(tài)嗦明。但在實質(zhì)上,圖層的屬性值還是動畫執(zhí)行前的初始值蚪燕,并沒有真正被改變娶牌。
4.2:關(guān)鍵幀動畫(CAKeyframeAnimation)
CAKeyframeAnimation和CABaseAnimation都屬于CAPropertyAnimatin的子類奔浅。CABaseAnimation只能從一個數(shù)值(fromValue)變換成另一個數(shù)值(toValue),而CAKeyframeAnimation則會使用一個NSArray保存一組關(guān)鍵幀。重要屬性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)的時間點,其取值范圍為0到1.0,keyTimes中的每一個時間值都對應(yīng)values中的每一幀.當keyTimes沒有設(shè)置的時候,各個關(guān)鍵幀的時間是平分的。效果演示:![](http://upload-images.jianshu.io/upload_images/1663804-5979589fde6eac46.gif?imageMogr2/auto-orient/strip)圓形路徑動畫代碼演示:
?
1
2
3
4
5

<code
class
=
"hljs avrasm has-numbering"

CAKeyframeAnimation *anima = [CAKeyframeAnimation animationWithKeyPath:@<span
class
=
"hljs-string"

"position"
</span>]<span
class
=
"hljs-comment"

;</span>

UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(SCREEN_WIDTH/<span
class
=
"hljs-number"

2
</span>-<span
class
=
"hljs-number"

100
</span>, SCREEN_HEIGHT/<span
class
=
"hljs-number"

2
</span>-<span
class
=
"hljs-number"

100
</span>, <span
class
=
"hljs-number"

200
</span>, <span
class
=
"hljs-number"

200
</span>)]<span
class
=
"hljs-comment"

;</span>

anima<span
class
=
"hljs-preprocessor"

.path</span> = path<span
class
=
"hljs-preprocessor"
.CGPath</span><span
class
=
"hljs-comment"
;</span>

anima<span
class
=
"hljs-preprocessor"

.duration</span> = <span
class
=
"hljs-number"

2.0
</span>f<span
class
=
"hljs-comment"

;</span>

[_demoView<span
class
=
"hljs-preprocessor"

.layer</span> addAnimation:anima forKey:@<span
class
=
"hljs-string"

"pathAnimation"
</span>]<span
class
=
"hljs-comment"

;</span></code>

說明:CABasicAnimation可看做是最多只有2個關(guān)鍵幀的CAKeyframeAnimation
4.3:組動畫(CAAnimationGroup)
CAAnimation的子類寿羞,可以保存一組動畫對象猖凛,將CAAnimationGroup對象加入層后,組中所有動畫對象可以同時并發(fā)運行绪穆。重要屬性animations : 用來保存一組動畫對象的NSArray效果演示:![](http://upload-images.jianshu.io/upload_images/1663804-a0467522a28c20cd.gif?imageMogr2/auto-orient/strip)組動畫代碼演示:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

<code
class
=
"hljs perl has-numbering"

CAKeyframeAnimation <span
class
=
"hljs-variable"
*anima1</span> = [CAKeyframeAnimation animationWithKeyPath:<span
class
=
"hljs-variable"
@
"</span>position<span class="
hljs-string
">"
];

NSValue <span
class
=
"hljs-variable"

*value0</span> = [NSValue valueWithCGPoint:CGPointMake(
0
, SCREEN_HEIGHT/
2

50
)];

NSValue <span
class
=
"hljs-variable"

*value1</span> = [NSValue valueWithCGPoint:CGPointMake(SCREEN_WIDTH/
3
, SCREEN_HEIGHT/
2

50
)];

NSValue <span
class
=
"hljs-variable"

*value2</span> = [NSValue valueWithCGPoint:CGPointMake(SCREEN_WIDTH/
3
, SCREEN_HEIGHT/
2

50
)];

NSValue <span
class
=
"hljs-variable"

*value3</span> = [NSValue valueWithCGPoint:CGPointMake(SCREEN_WIDTH<span
class
=
"hljs-variable"

2
</span>/
3
, SCREEN_HEIGHT/
2

50
)];

NSValue <span
class
=
"hljs-variable"

*value4</span> = [NSValue valueWithCGPoint:CGPointMake(SCREEN_WIDTH<span
class
=
"hljs-variable"

2
</span>/
3
, SCREEN_HEIGHT/
2

50
)];

NSValue <span
class
=
"hljs-variable"

*value5</span> = [NSValue valueWithCGPoint:CGPointMake(SCREEN_WIDTH, SCREEN_HEIGHT/
2

50
)];

anima1.values = [NSArray arrayWithObjects:value0,value1,value2,value3,value4,value5, nil];

//縮放動畫

CABasicAnimation <span
class
=
"hljs-variable"

*anima2</span> = [CABasicAnimation animationWithKeyPath:<span
class
=
"hljs-variable"
@
"</span>transform.scale"
</span>];

anima2.fromValue = [NSNumber numberWithFloat:<span
class
=
"hljs-number"

0
</span>.<span
class
=
"hljs-number"

8
</span>f];

anima2.toValue = [NSNumber numberWithFloat:<span
class
=
"hljs-number"

2.0
</span>f];

<span
class
=
"hljs-regexp"

//</span>旋轉(zhuǎn)動畫

CABasicAnimation <span
class
=
"hljs-variable"

*anima3</span> = [CABasicAnimation animationWithKeyPath:<span
class
=
"hljs-variable"
@
"</span>transform.rotation<span class="
hljs-string
">"
];

anima3.toValue = [NSNumber numberWithFloat:M_PI<span
class
=
"hljs-variable"

4
</span>];

//組動畫

CAAnimationGroup <span
class
=
"hljs-variable"

*groupAnimation</span> = [CAAnimationGroup animation];

groupAnimation.animations = [NSArray arrayWithObjects:anima1,anima2,anima3, nil];

groupAnimation.duration =
4
.0f;

[_demoView.layer addAnimation:groupAnimation forKey:<span
class
=
"hljs-variable"

@
"</span>groupAnimation"
</span>];</code>

4.4:過渡動畫(CATransition)
CAAnimation的子類辨泳,用于做過渡動畫或者轉(zhuǎn)場動畫,能夠為層提供移出屏幕和移入屏幕的動畫效果玖院。重要屬性type:動畫過渡類型Apple 官方的SDK其實只提供了四種過渡效果菠红。- kCATransitionFade 漸變效果- kCATransitionMoveIn 進入覆蓋效果- kCATransitionPush 推出效果- kCATransitionReveal 揭露離開效果私有API提供了其他很多非常炫的過渡動畫,比如@”cube”难菌、@”suckEffect”试溯、@”oglFlip”镊尺、 @”rippleEffect”足淆、@”pageCurl”、@”pageUnCurl”讼撒、@”cameraIrisHollowOpen”燎窘、@”cameraIrisHollowClose”等摹闽。注意點私有api,不建議開發(fā)者們使用褐健。因為蘋果公司不提供維護付鹿,并且有可能造成你的app審核不通過。
subtype:動畫過渡方向
kCATransitionFromRight 從右側(cè)進入kCATransitionFromLeft 從左側(cè)進入kCATransitionFromTop 從頂部進入kCATransitionFromBottom 從底部進入startProgress:動畫起點(在整體動畫的百分比)endProgress:動畫終點(在整體動畫的百分比)
效果演示:![](http://upload-images.jianshu.io/upload_images/1663804-79a6567c8fefa6bd.gif?imageMogr2/auto-orient/strip)
4.5:綜合案例
4.5.1 : 仿Path菜單效果
效果演示:![](http://upload-images.jianshu.io/upload_images/1663804-680d094cb9fd8907.gif?imageMogr2/auto-orient/strip)
動畫解析:1蚜迅、點擊紅色按鈕舵匾,紅色按鈕旋轉(zhuǎn)。(旋轉(zhuǎn)動畫)2慢叨、黑色小按鈕依次彈出纽匙,并且?guī)в行D(zhuǎn)效果。(位移動畫拍谐、旋轉(zhuǎn)動畫烛缔、組動畫)3馏段、點擊黑色小按鈕,其他按鈕消失践瓷,被點擊的黑色按鈕變大變淡消失院喜。(縮放動畫、alpha動畫晕翠、組動畫)博主的話:代碼過多喷舀,這里不做演示。文章最后提供代碼下載地址淋肾。
4.5.2: 仿釘釘菜單效果
效果演示:![](http://upload-images.jianshu.io/upload_images/1663804-3887c5a7eed9097c.gif?imageMogr2/auto-orient/strip)看上去挺炫的硫麻,其實實現(xiàn)很簡單,就是位移動畫+縮放動畫樊卓。
4.5.3: 點贊煙花效果動畫
效果演示:![](http://upload-images.jianshu.io/upload_images/1663804-65f020f1a577f9e2.gif?imageMogr2/auto-orient/strip)這里其實只有按鈕變大效果使用的縮放動畫拿愧。煙花效果 使用的是一種比較特殊的動畫–粒子動畫。一個粒子系統(tǒng)一般有兩部分組成:1碌尔、CAEmitterCell:可以看作是單個粒子的原型(例如,一個單一的粉撲在一團煙霧)唾戚。當散發(fā)出一個粒子柳洋,UIKit根據(jù)這個發(fā)射粒子和定義的基礎(chǔ)上創(chuàng)建一個隨機粒子。此原型包括一些屬性來控制粒子的圖片叹坦,顏色熊镣,方向,運動立由,縮放比例和生命周期轧钓。2、CAEmitterLayer:主要控制發(fā)射源的位置锐膜、尺寸毕箍、發(fā)射模式、發(fā)射源的形狀等等道盏。以上兩個類的屬性還是比較多的而柑,這里就不細講了。大家可以google一下荷逞,詳細的了解吧媒咳。
五、總結(jié)
任何復雜的動畫其實都是由一個個簡單的動畫組裝而成的种远,只要我們善于分解和組裝涩澡,我們就能實現(xiàn)出滿意的效果。動畫其實也不是那么難坠敷。
六妙同、下載地址
github下載地址:https://github.com/yixiangboy/IOSAnimationDemogithub:https://github.com/yixiangboy

iOS動畫效果與上文相互結(jié)合:

理論 UIview VS UIlayer
UIView只是CALyer之上的封裝射富,更準確的來說,UIView是CALyer的簡版封裝粥帚,加上事件處理的集合類胰耗。 CALayer是QuartzCore庫內(nèi)的類,是iOS上最基本的繪制單元芒涡。其次柴灯,我們知道iOS平臺的Cocoa Touch 是源于OS X平臺的Cocoa),是在Cocoa的基礎(chǔ)上添加了適用于移動手機設(shè)備的手勢識別费尽、動畫等特性赠群;但從底層實現(xiàn)上來說,Cocoa Touch與Cocoa共用一套底層的庫旱幼,其中就包括了QuartCore.framework乎串;但QuartCore.framework一開始就是為OS X設(shè)計的,所以其中有部分特性是不適合做移動設(shè)備開發(fā)的速警,比如最重要的坐標系統(tǒng)。因此鸯两,我們也就不難理解為何UIView/NSView在CALayer上做了一層封裝闷旧。
基于UIView實現(xiàn)的動畫
簡單的Block動畫

1457663935860701.jpg

UIView
1457664573232625.jpg

彈性動畫
1457663850180187.jpg

關(guān)鍵幀動畫(中間可以添加合適多的幀來做不同的銜接動畫)
1457663842114629.jpg

CALayer動畫
1457663689886006.png

常用屬性
duration : 動畫的持續(xù)時間
beginTime : 動畫的開始時間
repeatCount : 動畫的重復次數(shù)
autoreverses : 執(zhí)行的動畫按照原動畫返回執(zhí)行
timingFunction : 控制動畫的顯示節(jié)奏,系統(tǒng)提供五種值選擇钧唐, 分別是

kCAMediaTimingFunctionLinear 線性動畫
kCAMediaTimingFunctionEaseIn 先慢后快(慢進快出)
kCAMediaTimingFunctionEaseOut 先塊后慢(快進慢出)
kCAMediaTimingFunctionEaseInEaseOut 先慢后快再慢
kCAMediaTimingFunctionDefault 默認忙灼,也屬于中間比較快
path:關(guān)鍵幀動畫中的執(zhí)行路徑
type:過渡動畫的動畫類型,系統(tǒng)提供了四種過渡動畫:
kCATransitionFade 漸變效果
kCATransitionMoveIn 進入覆蓋效果
kCATransitionPush 推出效果
kCATransitionReveal 揭露離開效果
subtype : 過渡動畫的動畫方向
kCATransitionFromRight 從右側(cè)進入
kCATransitionFromLeft 從左側(cè)進入
kCATransitionFromTop 從頂部進入
kCATransitionFromBottom 從底部進入
基礎(chǔ)動畫主要提供了對于CALayer對象中的可變屬性進行簡單動畫的操作钝侠。比如:位移该园、透明度、縮放帅韧、旋轉(zhuǎn)里初、背景色等等。 重要屬性 fromValue : keyPath對應(yīng)的初始值 toValue : keyPath對應(yīng)的結(jié)束值忽舟。
基礎(chǔ)動畫(CABaseAnimation) 0:1 1:0 實現(xiàn)下拉剪頭的展開和收起

1457663394494561.jpg

關(guān)鍵幀動畫(CAKeyframeAnimation) CAKeyframeAnimation和CABaseAnimation都屬于CAPropertyAnimatin的子類双妨。CABaseAnimation只能從一個數(shù)值(fromValue)變換成另一個數(shù)值(toValue),而CAKeyframeAnimation則會使用一個NSArray保存一組關(guān)鍵幀。 重要屬性 values : 就是上述的NSArray對象叮阅。里面的元素稱為”關(guān)鍵幀”(keyframe)刁品。動畫對象會在指定的時間(duration)內(nèi),依次顯示values數(shù)組中的每一個關(guān)鍵幀 path : 可以設(shè)置一個CGPathRefCGMutablePathRef,讓層跟著路徑移動浩姥。path只對CALayer的anchorPoint和position起作用挑随。如果你設(shè)置了path,那么values將被忽略勒叠。 keyTimes : 可以為對應(yīng)的關(guān)鍵幀指定對應(yīng)的時間點,其取值范圍為0到1.0,keyTimes中的每一個時間值都對應(yīng)values中的每一幀.當keyTimes沒有設(shè)置的時候,各個關(guān)鍵幀的時間是平分的兜挨。
組合動畫:
1457663422759611.jpg
1457663422759611.jpg

過渡動畫(CATransition) 多數(shù)為私有的API使用后無法上架app膏孟。 私有API提供了其他很多非常炫的過渡動畫,比如@”cube”暑劝、@”suckEffect”骆莹、@”oglFlip”、 @”rippleEffect”担猛、@”pageCurl”幕垦、@”pageUnCurl”、@”cameraIrisHollowOpen”傅联、@”cameraIrisHollowClose”等先改。
粒子動畫
transform動畫
transform是一個非常重要的屬性,它在矩陣變換的層面上改變視圖的顯示效果蒸走,完成旋轉(zhuǎn)仇奶、形變、平移等等操作比驻。在它被修改的同時该溯,視圖的frame也會被真實改變。有兩個數(shù)據(jù)類型用來表示transform别惦,分別是CGAffineTransform和CATransform3D狈茉。前者作用于UIView,后者為layer層次的變換類型掸掸÷惹欤基于后者可以實現(xiàn)更加強大的功能。 對于想要了解矩陣變換是如何作用實現(xiàn)的扰付,可以參考這篇博客: CGAffineTransform 放射變換
1457663243155666.jpg
在開始使用transform實現(xiàn)你的動畫之前堤撵,我先介紹幾個常用的函數(shù):
1457663258881584.jpg

transform嚴格的說不是一種動畫,而是動畫中的一部分操作羽莺,我拿出來說是因為它同時出現(xiàn)在了UIView 動畫和CALayer動畫中实昨。
一些應(yīng)用
利用上面CALayer 基礎(chǔ)動畫的代碼實現(xiàn)下拉剪頭的展開和收起,還可以實現(xiàn)時鐘指針的旋轉(zhuǎn)
1457662432283106.jpg

輸入框在輸入錯誤信息時的搖晃效果盐固。
1457663271950660.gif

利用CAShapeLayer 和CABasicAnimation 可以實現(xiàn)加載動畫屠橄。
1457662577168149.png

iOS渲染視圖的層級圖:
1457662590764759.png

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市闰挡,隨后出現(xiàn)的幾起案子锐墙,更是在濱河造成了極大的恐慌,老刑警劉巖长酗,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件溪北,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機之拨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門茉继,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蚀乔,你說我怎么就攤上這事烁竭。” “怎么了吉挣?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵派撕,是天一觀的道長。 經(jīng)常有香客問我睬魂,道長终吼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任氯哮,我火速辦了婚禮际跪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘喉钢。我一直安慰自己姆打,他們只是感情好,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布肠虽。 她就那樣靜靜地躺著穴肘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪舔痕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天豹缀,我揣著相機與錄音伯复,去河邊找鬼。 笑死邢笙,一個胖子當著我的面吹牛啸如,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播氮惯,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼叮雳,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了妇汗?” 一聲冷哼從身側(cè)響起帘不,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎杨箭,沒想到半個月后寞焙,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年捣郊,在試婚紗的時候發(fā)現(xiàn)自己被綠了辽狈。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡呛牲,死狀恐怖刮萌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情娘扩,我是刑警寧澤着茸,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站畜侦,受9級特大地震影響元扔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜旋膳,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一澎语、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧验懊,春花似錦擅羞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至碱工,卻和暖如春娃承,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背怕篷。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工历筝, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人廊谓。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓梳猪,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蒸痹。 傳聞我的和親對象是個殘疾皇子春弥,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容