1. 程式人生 > >【IOS功能實現】之Core Animation動畫開發總結(CALayer)

【IOS功能實現】之Core Animation動畫開發總結(CALayer)

一.重要引數

bounds,frame,position屬於基本的幾何定位,相互之間數值變化會相互影響

anchorPoint:單位引數(0-1)表示,變形(transform)時候的變換源點

zPosition:相當於css中z-index的概念,Apple建議不要用這個來替代CALayer層次設定。

cornerRadius:圓角

二.幾何變形(Transforming a Layer's Geometry)

1.用CATransform3D系列方法

[cpp] view plaincopyprint?
  1. //將CGAffineTransform轉換成CATransform3D
  2. layer1_1.transform=CATransform3DMakeAffineTransform(CGAffineTransformMakeScale(1, -1));  
  3. //CATransform3D系列方法
  4. layer1_1.transform=CATransform3DMakeScale(-1, 1, 1);        
  5. layer1_1.transform=CATransform3DScale(CATransform3DMakeScale(-2, 1, 1), -1, 1, 1);  
  6. layer1_1.transform=CATransform3DIdentity;  

2.修改CATransform3D的data structure

[cpp] view plaincopyprint?
  1. CATransform3D trans=CATransform3DIdentity;  
  2. NSLog(@"%f",trans.m44);  
  3. //不能是1除以,一定要1.0除以1000(zDistance)
  4. //wrong     trans.m34=1/100.00
  5. trans.m34=-1.0/1000;  
  6. trans = CATransform3DTranslate(trans, 0, 0, -240);  
  7. trans = CATransform3DRotate(trans, d2r(90), 1, 0, 0);  
  8. trans = CATransform3DTranslate(trans, 0, 0, 240);  
  9. [layer1 setTransform:trans];  

3.key-valre設定key Paths(rotation,scale,translation)
[cpp] view plaincopyprint?
  1. [layer1 setValue:[NSNumber numberWithInt:200] forKeyPath:@"transform.translation.x"];  

三.Layer數層結構(Layer-Tree Hierarchy)

1.add,insert,remove,replace來進行樹狀結構的構建

2.重置(Reposition and Resizing)layer

a)你可以通過修改第一點提到的幾個引數來調整大小。

b)needsDisplayOnBoundsChange設定YES,則在bounds變化時,自動呼叫setNeedsDisplay,呼叫layer的display的方法,或者直接顯示呼叫setNeedsDisplay(不能使用setNeedsDisplayInRect),也會呼叫自定義layer的display方法。或者是setNeesLayout,呼叫layer的layoutSubLayers。(PS:無法使用layoutManager和autoResizingMask方法,這個是Mac OS上的方法。)

c)在UIView的layoutSubviews裡實現自定義layout的方法。

3.masksToBounds設定YES,則裁剪subLayers。否則不裁剪,subLayers可以超過superLayer的bounds。

4.Action

當更改layer的引數或者將layer新增,刪除,隱藏,替換時觸發

觸發方法可以是子類化CALayer,-(id<CAAction>)actionForKey:(NSString*)key;代理方式-(id<CAAction>)actionForLayer:(CALayer*) forKey:(NSString*)key

[cpp] view plaincopyprint?
  1. -(id<CAAction>)actionForLayer:(CALayer *)layer forKey:(NSString *)event{  
  2.         CATransition *anim=nil;  
  3.         if([event isEqualToString:@"contents"]){  
  4.                 anim=[CATransition animation];  
  5.                 anim.duration=2;  
  6.                 anim.timingFunction=[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];  
  7.                 [email protected]"cube";  
  8.                 anim.subtype=kCATransitionFromRight;  
  9.         }  
  10.         return anim;  
  11.         //不執行任何動畫
  12.         //return nil;
  13. }  

蘋果文件種提供了修改sublayers預設動畫的方法

[cpp] view plaincopyprint?
  1. NSMutableDictionary *cActions=[NSMutableDictionary dictionaryWithDictionary:[layer1_1 actions]];  
  2. [cActions setObject:[NSNull null] forKey:@"sublayers"];  
  3. layer1_1.actions=cActions;  

實現CAAction Protocol

代理類中實現方法runActionForKey:object:arguments

[cpp] view plaincopyprint?
  1. -(void)runActionForKey:(NSString *)event object:(id)anObject arguments:(NSDictionary *)dict{  
  2.         NSLog(@"runActionForKey:\"%@\" object:%@ arguments:%@", event, anObject, dict);  
  3.         CATransition *anim=nil;  
  4.         if([event isEqualToString:@"test"]){  
  5.                 anim=[CATransition animation];  
  6.                 anim.duration=2;  
  7.                 anim.timingFunction=[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];  
  8.                 [email protected]"cube";  
  9.                 anim.subtype=kCATransitionFromRight;  
  10.         }  
  11.         [(CALayer*)anObject addAnimation:anim forKey:@"contets"];  
  12. }  

觸發runActionForKey [cpp] view plaincopyprint?
  1. //新增自定義的action以及對應的觸發方法所在的代理,應該可以定義一個動畫子類(CAAnimation)
  2. layer1.actions = [NSDictionary dictionaryWithObjectsAndKeys:[[FCLayerDelegate alloc]init], @"test", nil];  
  3. //實際觸發的地方,當設定test引數,其實最後觸發的是runActionForKey種的立方體旋轉
  4. [layer1 setValue:[NSNumber numberWithInt:19] forKey:@"test"];  

四.提供Layer內容(Providing Layer Content)

1.contents屬性設定CGImageRef

[cpp] view plaincopyprint?
  1. layer1.contents=(id)image1.CGImage;  
2.用delegate來提供內容

a)displayLayer:(CALayer*)

b)-(void)drawLayer:(CALayer*) inContext:(CGContextRef)

[cpp] view plaincopyprint?
  1. //宣告代理
  2. @interface FCLayerDeledegate : NSObject  
  3. @end  
  4. //實現代理
  5. @implementation FCLayerDelegate  
  6. //覆蓋這個方法,就不會執行後面的方法,2者取其一,根據傳入的值來判斷下一步操作
  7. -(void)displayLayer:(CALayer *)layer{  
  8. NSLog(@"%@",[layer valueForKey:@"test"]);  
  9. }  
  10. -(void)drawLayer:(CALayer *)ly inContext:(CGContextRef)context  
  11. {   
  12. CGContextSetFillColorWithColor(context, [[UIColor redColor]CGColor]);  
  13. CGContextFillRect(context, ly.bounds);  
  14. }  
  15. @end  
[cpp] view plaincopyprint?
  1. //執行程式碼
  2. CALayer* layer1_3=[CALayer layer];          
  3. layer1_3.delegate=[[FCLayerDelegate alloc]init];  
  4. [layer1_3 setValue:@"testString" forKey:@"test"];  
  5. [layer1_3 setNeedsDisplay];  

ps:以上方法用於CALayer本身(非自己子類)

3) 用子類提供內容

a)display

b)drawInContext:(CGContextRef)

和前面代理模式差不多,只不過少傳layer引數,因為layer就是其本身(self);

4)內容的佈局

預設情況下,內容圖片是會鋪開充滿整個layer的bounds的,如果要使得contents按照原來尺寸顯示在layer中,就要設定ContentsGravity

大致2種引數

1.位置引數,注意,ios座標是y是相反的,所以bottom就是top

2.設定鋪滿方式,3種

[cpp] view plaincopyprint?
  1. layer1_3.contentsGravity=kCAGravityBottomLeft;  
  2. 相關推薦

    IOS功能實現Core Animation動畫開發總結(CALayer)

    一.重要引數 bounds,frame,position屬於基本的幾何定位,相互之間數值變化會相互影響 anchorPoint:單位引數(0-1)表示,變形(transform)時候的變換源點 zPosition:相當於css中z-index的概念,

    IOS功能實現:下拉列表

    通過網上資料,自己藉助資料寫的程式碼,這是完全程式碼 //**************************************************************************** @interface DropDown1 : UIView <UITableVi

    [原創]unity3D學習功能實現二:圖片的旋轉/2d物體的旋轉

    目標:滑鼠點選後,圖片朝向滑鼠點選的地方 涉及到:Mathf.Atan2(反正是計算角度的),rotation,Quaternion.Slerp 思路:下面的圖片是x軸對稱的,所以這個旋轉也是以圖片箭頭開始旋轉的。(為什麼?可能跟Atan2有關),根據滑鼠點選的位置與圖片的位置計算旋轉角度,在Quaterni

    [原創]unity3D學習功能實現三:例項化

    用處:一般當場景出現兩個及兩個以上,或者會出現重複的物體的時候,用例項化比較方便 目標:滑鼠點選後,在滑鼠點選的位置出現一個小球 涉及到:預製件,Instantiate(預製件,newVector(

    Java面試題分頁功能實現

    以下內容是根據網上內容以及傳智播客教學整理而來,侵刪。 分頁的實現可分為兩大類:一、資料在Java程式碼中進行分頁,然後取得當前頁資料;二、在資料庫中直接取得當前頁資料。通常面試官都希望聽到後者,因為那才是高效的方法。你如果想讓面試官覺得你的能力高的話你就先否定他的問

    功能實現實現設置概率的隨機數

    private wan cti 就是 common getch integer turn num 1.故事背景   生成一個隨機紅包,紅包的數值0.1元-100元不等,其具體概率為:0.1元為最小單位,0.1元到0.5元的概率為40%,0.5元到1元的概率為50%,1元-2

    剖析 | SOFARPC 框架SOFARPC 同步非同步實現剖析

    前言 這一篇,我們為大家帶來了開發過程中,最常接觸到的同步非同步呼叫解析。本文會介紹下同步非同步的使用場景,以及 SOFARPC 中的程式碼實現機制,為了方便大家理解和閱讀程式碼。不會過多的設計程式碼實現細節,更多的還是希望大家從中有所收穫,並能夠獨立閱讀核心程式碼。 原理剖析 SOFARPC 以基於

    高併發-搶紅包案例四:使用Redis+Lua指令碼實現搶紅包並非同步持久化到資料庫

    文章目錄導讀概述 導讀 概述 上面三篇博文是使用的MySql資料庫來作為資料的載體資料最終會將資料儲存到磁碟中,而Redis使用的是記憶體,記憶體的速度比磁碟速度肯定要快很多. 對於使用 Redis實現搶紅包,首先需要知道的是Redis的功能不如資料庫

    移動端實現相機喚起及圖片上傳功能(包括微信)

    前言 目前有個需求是圖片拍照上傳的功能,但是我就是死活掉不起相機。。。總是開啟的是檔案目錄OR上傳圖片。。。。而不是相機。。。 所以對比了下 程式碼: 參考了百度移動端實現方式。。。程式碼很簡單,對就這一句! <input type="file" acce

    wav音訊解析wavread函式的C++實現

          本文由三部分組成,第一部分背景介紹 —— 音訊型別及本文動機,第二部分類比matlab下wavread()函式的作用,第三部分則給出該函式的C++實現。 一 背景介紹 1.1 本文動機 1)所有wav音訊處理的基礎就是將wav格式的檔案解析出來,解析成陣列才

    Java併發程式設計六:Runnable和Thread實現多執行緒的區別(含程式碼)

        Java中實現多執行緒有兩種方法:繼承Thread類、實現Runnable介面,在程式開發中只要是多執行緒,肯定永遠以實現Runnable介面為主,因為實現Runnable介面相比繼承Th

    ios學習記錄- 通過nib檔案實現自定義表檢視單元

    新增自定義表檢視單元有兩種方法:一種方法是建立單元時在程式中新增子檢視,第二種方法是從分鏡或者nib檔案中載入它們,在這裡我們簡單採用第二種方法 一般來說,ios資料列表包含了兩部分:表檢視(分組表和無格式表)和表檢視單元。每個表檢視都是UITable

    遊戲設計模式三 狀態模式、有限狀態機 & Unity版本實現

    毛星雲,網路ID「淺墨」,90後,熱愛遊戲開發、遊戲引擎、計算機圖形、實時渲染等技術,就職於騰訊互娛。 微軟最有價值專家 著作《Windows遊戲程式設計之從零開始》、《OpenCV3程式設計入門》 碩士就讀於南京航空航天大學航天學院(2013級碩士研究生),已於2016年三月畢業。本科

    Unity3D Shader程式設計十 深入理解Unity5中的Standard Shader(二)&螢幕油畫特效的實現

    本系列文章由出品,轉載請註明出處。 本文工程使用的Unity3D版本:5.2.1 概要:本文講解了Unity中著色器編譯多樣化的思路,並對Standard Shader中正向基礎渲染通道的原始碼進行了分析,以及對螢幕油畫特效進行了實現。眾所周知,Unity官方文件對Shade

    玩轉GridView簡單實現隱藏列

        做專案中有時候,如果設定了gridview隱藏列,問題就變得很簡單,所以小編總結了兩種實驗過的方法分享給大家。 第一種.     在gridview的RowCreated的方法中設定需要隱藏的

    iOS介面處理使用storyboard實現頁面跳轉,簡單的資料傳遞

    http://blog.csdn.net/mad1989/article/details/7919504         由於最近才接觸到IOS,蘋果已經建議storyboard來搭建所有介面了,於是我也追隨時尚,直接開始使用storyboard。(不料在涉及到頁面跳轉

    Java併發程式設計十:使用wait/notify/notifyAll實現執行緒間通訊的幾點重要說明

    在Java中,可以通過配合呼叫Object物件的wait()方法和notify()方法或notifyAll()方法來實現執行緒間的通訊。線上程中呼叫wait()方法,將阻塞等待其他執行緒的通知(其

    Unity Shader程式設計十五 螢幕高斯模糊(Gaussian Blur)後期特效的實現

    本篇文章將分析如何在Unity中基於Shader實現高斯模糊屏幕後期特效。首先放出最終的實現效果。如下幾幅圖,是在Unity中使用本文所實現的Shader得到的高斯模糊屏幕後期特效與原始圖的效果對比圖。卡通風格的效果測試:寫實風格的效果測試:OK,下面我們開始分析如何在Uni

    Unity3D Shader程式設計八 Unity5新版Shader模板原始碼解析&徑向模糊螢幕特效的實現

       概要:本文對Unity5中全新的三種Shader模板的原始碼進行了解析,然後還講解了運動模糊螢幕特效的實現方法。前言時隔9個月,終於有了一些稍微空閒的時間,可以進行一些更新了。鑑於以後可以用來寫部落格的時間肯定不會非常充裕,個人覺得再講Shader的基礎寫法比較拖節奏,

    Unity3D Shader程式設計十二 可程式設計Shader初步 & 漫反射可程式設計Shader的實現

    毛星雲,網路ID「淺墨」,90後,熱愛遊戲開發、遊戲引擎、計算機圖形、實時渲染等技術,就職於騰訊互娛。 微軟最有價值專家 著作《Windows遊戲程式設計之從零開始》、《OpenCV3程式設計入門》 碩士就讀於南京航空航天大學航天學院(2013級碩士研究生),已於2016年三月畢業。本科