【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?-
//將CGAffineTransform轉換成CATransform3D
- layer1_1.transform=CATransform3DMakeAffineTransform(CGAffineTransformMakeScale(1, -1));
- //CATransform3D系列方法
- layer1_1.transform=CATransform3DMakeScale(-1, 1, 1);
- layer1_1.transform=CATransform3DScale(CATransform3DMakeScale(-2, 1, 1), -1, 1, 1);
-
layer1_1.transform=CATransform3DIdentity;
2.修改CATransform3D的data structure
[cpp] view plaincopyprint?- CATransform3D trans=CATransform3DIdentity;
- NSLog(@"%f",trans.m44);
- //不能是1除以,一定要1.0除以1000(zDistance)
- //wrong trans.m34=1/100.00
- trans.m34=-1.0/1000;
- trans = CATransform3DTranslate(trans, 0, 0, -240);
-
trans = CATransform3DRotate(trans, d2r(90), 1, 0, 0);
- trans = CATransform3DTranslate(trans, 0, 0, 240);
- [layer1 setTransform:trans];
3.key-valre設定key Paths(rotation,scale,translation)
[cpp] view plaincopyprint?
- [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?- -(id<CAAction>)actionForLayer:(CALayer *)layer forKey:(NSString *)event{
- CATransition *anim=nil;
- if([event isEqualToString:@"contents"]){
- anim=[CATransition animation];
- anim.duration=2;
- anim.timingFunction=[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
- [email protected]"cube";
- anim.subtype=kCATransitionFromRight;
- }
- return anim;
- //不執行任何動畫
- //return nil;
- }
蘋果文件種提供了修改sublayers預設動畫的方法
[cpp] view plaincopyprint?- NSMutableDictionary *cActions=[NSMutableDictionary dictionaryWithDictionary:[layer1_1 actions]];
- [cActions setObject:[NSNull null] forKey:@"sublayers"];
- layer1_1.actions=cActions;
實現CAAction Protocol
代理類中實現方法runActionForKey:object:arguments
[cpp] view plaincopyprint?- -(void)runActionForKey:(NSString *)event object:(id)anObject arguments:(NSDictionary *)dict{
- NSLog(@"runActionForKey:\"%@\" object:%@ arguments:%@", event, anObject, dict);
- CATransition *anim=nil;
- if([event isEqualToString:@"test"]){
- anim=[CATransition animation];
- anim.duration=2;
- anim.timingFunction=[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
- [email protected]"cube";
- anim.subtype=kCATransitionFromRight;
- }
- [(CALayer*)anObject addAnimation:anim forKey:@"contets"];
- }
觸發runActionForKey [cpp] view plaincopyprint?
- //新增自定義的action以及對應的觸發方法所在的代理,應該可以定義一個動畫子類(CAAnimation)
- layer1.actions = [NSDictionary dictionaryWithObjectsAndKeys:[[FCLayerDelegate alloc]init], @"test", nil];
- //實際觸發的地方,當設定test引數,其實最後觸發的是runActionForKey種的立方體旋轉
- [layer1 setValue:[NSNumber numberWithInt:19] forKey:@"test"];
四.提供Layer內容(Providing Layer Content)
1.contents屬性設定CGImageRef
[cpp] view plaincopyprint?- layer1.contents=(id)image1.CGImage;
a)displayLayer:(CALayer*)
b)-(void)drawLayer:(CALayer*) inContext:(CGContextRef)
- //宣告代理
- @interface FCLayerDeledegate : NSObject
- @end
- //實現代理
- @implementation FCLayerDelegate
- //覆蓋這個方法,就不會執行後面的方法,2者取其一,根據傳入的值來判斷下一步操作
- -(void)displayLayer:(CALayer *)layer{
- NSLog(@"%@",[layer valueForKey:@"test"]);
- }
- -(void)drawLayer:(CALayer *)ly inContext:(CGContextRef)context
- {
- CGContextSetFillColorWithColor(context, [[UIColor redColor]CGColor]);
- CGContextFillRect(context, ly.bounds);
- }
- @end
- //執行程式碼
- CALayer* layer1_3=[CALayer layer];
- layer1_3.delegate=[[FCLayerDelegate alloc]init];
- [layer1_3 setValue:@"testString" forKey:@"test"];
- [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?- layer1_3.contentsGravity=kCAGravityBottomLeft;
-
相關推薦
【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年三月畢業。本科