相關資源
GitHub粒子發(fā)射和復制圖層示例
GitHub粘性控件示例
GitHub彈性動畫
響應者手勢分析
CAEmitter分析
簡介
這是一個什么對象呢,官方簡述起是一個管理基于圖像內(nèi)容的對象,并且允許你在內(nèi)容上執(zhí)行動畫。我們一直通俗的理解就是它的作用就是用于顯示的。在UIKit繼承樹中我們可以發(fā)現(xiàn)只有UIView中有l(wèi)ayer屬性。
層通常被用在對View的輔助處理,但也可以直接使用顯示內(nèi)容。一個層的主要工作是管理您提供的可視化內(nèi)容,但層本身具有可設置的可視屬性,如背景顏色、邊框和陰影。除了管理視覺內(nèi)容外,該層還保存有關其內(nèi)容的幾何信息(如它的位置、大小和轉(zhuǎn)換),這些幾何信息決定著內(nèi)容在屏幕上的展現(xiàn)。一個layer對象通過遵守CAMediaTiming協(xié)議 封裝了時間、layer的節(jié)奏和它的動畫,因為CAMediaTiming協(xié)議定義了層的定時信息。
如果圖層對象是由視圖創(chuàng)建的,視圖通常會自動將其作為層的代理,并且這種關系不應該被強制改變。對于創(chuàng)建自己的層,可以制定一個它的代理對象,可以使用該代理動態(tài)地為層提供內(nèi)容,并執(zhí)行其他任務。一層也有一個布局管理器對象(分配到的布局管理器的屬性)來管理子視圖的布局分開。
基本注意點
- 對于非根層具有隱式動畫(對于可動畫的屬性)
- 對圖層的操作非常豐富,可查看屬性,設置各種效果
- 繼承自nsoject,不具有responder相應的屬性
- layer.transform的類型是CATransform3D(QuartzCore框架),view.transform的類型是CGAffineTransform(CoreGraphics框架),對兩者的transform屬性操作會影響兩個的frame(兩個frame是同步的,view的frame決定它的responder范圍)。
- position屬性相當于view.center(這兩個值經(jīng)測試是同步的),這兩個值得改變不僅可以通過直接設值,還可以通過重新設置frame重新調(diào)整其值(這種情況下要根據(jù)anchor值系統(tǒng)給出相應的值)。
- anchorPoint 默認是0.5,0.5 ,改變transform 和frame不會影響它,只有通過設置anchorPoint屬性才會改變。
- 當layer.tansform存在時,不要重新設置frame( do not use frame if view is transformed since it will not correctly reflect the actual location of the view. use bounds + center instead)。
- 做旋轉(zhuǎn)和縮放(相當于改變bounds值)的時候會圍繞position(也就是view的center屬相)做調(diào)整,改變frame值。
說明:這里的情況是UIKit層面的動畫或者沒有動畫處理情況。
核心動畫 (這里扯一下CoreAnimation)
- UIView動畫與核心動畫的區(qū)別?
- 核心動畫只作用在layer.
- 核心動畫修改的值都是假像.它的真實位置沒有發(fā)生變化,不會改變layer的frame、transform屬性.
- 什么時候用UIView動畫什么時候用核心動畫?
- 當需要與用戶進行交互時用UIView,不需要與用戶進行交互時兩個都可以.
- 什么情況用核心動畫最多?
- 轉(zhuǎn)場動畫(UIView的轉(zhuǎn)場動畫類型比較少).
- 幀動畫.
- 動畫組.
CALayer介紹
QuartzCore框架之中的一個重要的類,QuartzCore中另外一個重要的類就是CoreAnimation。這篇就來介紹一下CALayer的幾個重要的子類:
- CAGradientLayer
漸變層在其背景色上繪制顏色漸變,填充層的形狀(包括圓角)。
// 添加或者獲取需要漸變的顏色,顏色的類型是CGColorRef,數(shù)組默認是nil
@property(nullable, copy) NSArray *colors;
// 起始點不僅能夠決定漸變的起始點,而且可以確定漸變方向
@property CGPoint startPoint;
@property CGPoint endPoint;
// 在起始點的基礎上確定每一個漸變站的位置
@property(nullable, copy) NSArray<NSNumber *> *locations;
- CAReplicatorLayer
CAReplocatorLayer是復制圖層,我們可以通過它,將其中的子layer進行拷貝,并進行一些差異處理。我們只需要對源圖層進行處理(包括動畫,形變,位移),在CAReplocatorLayer的作用下副本就會被原樣處理
//拷貝的次數(shù)(包括源圖層)
@property NSInteger instanceCount;
//是否開啟景深效果
@property BOOL preservesDepth;
//當CAReplicatorLayer的子Layer層進行動畫的時候,拷貝的副本執(zhí)行動畫的延時
@property CFTimeInterval instanceDelay;
//拷貝副本的3D變換
@property CATransform3D instanceTransform;
//拷貝副本的顏色變換
@property(nullable) CGColorRef instanceColor;
//每個拷貝副本的顏色偏移參數(shù)
- CAShapeLayer
CAShapeLayer是圖形圖層,我們可以自定義這個層的形狀。
// 圖層形狀路徑
@property(nullable) CGPathRef path;
//設置圖形的填充顏色
@property(nullable) CGColorRef fillColor;
/*
設置圖形的填充規(guī)則 選項如下:
非零填充
NSString *const kCAFillRuleNonZero;
奇偶填充
NSString *const kCAFillRuleEvenOdd;
*/
@property(copy) NSString *fillRule;
//設置Stroke線條顏色
@property(nullable) CGColorRef strokeColor;
//設置線條的起點與終點 0-1之間,默認是0和1
@property CGFloat strokeStart;
@property CGFloat strokeEnd;
//設置線條寬度
@property CGFloat lineWidth;
//設置兩條線段相交時銳角斜面長度(斜接限制)
@property CGFloat miterLimit;
/*
設置線條首尾的外觀
可選如下
NSString *const kCALineCapButt;無形狀
NSString *const kCALineCapRound;圓形
NSString *const kCALineCapSquare;方形
*/
@property(copy) NSString *lineCap;
/*
設置線段的鏈接方式
NSString *const kCALineJoinMiter;棱角
NSString *const kCALineJoinRound; 平滑
NSString *const kCALineJoinBevel;折線
*/
@property(copy) NSString *lineJoin;
//設置從哪個階段開始,例如: layer.lineDashPhase = 5;
@property CGFloat lineDashPhase;
//stroke線條的屬性,畫虛線(lineDash)
// 例如:layer.lineDashPattern = @[@05,@10,@2]; 表示實(5) 虛(10)實(2)循環(huán)劃線。
@property(nullable, copy) NSArray<NSNumber *> *lineDashPattern;
簡單應用:粘性控件(GitHub地址)
- CATextLayer
文本層提供簡單的文本布局和普通字符串或者屬性字符串的渲染,第一行與圖層的頂部對齊。
//渲染的文字字符串
@property(nullable, copy) id string;
//設置字體
@property(nullable) CFTypeRef font;
//設置字號
@property CGFloat fontSize;
//設置文字顏色
@property(nullable) CGColorRef foregroundColor;
//是否換行
@property(getter=isWrapped) BOOL wrapped;
//
無截斷模式
NSString * const kCATruncationNone;
截斷前部分
NSString * const kCATruncationStart;
截斷后部分
NSString * const kCATruncationEnd;
截斷中間
NSString * const kCATruncationMiddle;
@property(copy) NSString *truncationMode;
//
設置文字對齊模式
NSString * const kCAAlignmentNatural;
NSString * const kCAAlignmentLeft;
NSString * const kCAAlignmentRight;
NSString * const kCAAlignmentCenter;
NSString * const kCAAlignmentJustified;
@property(copy) NSString *alignmentMode;
- CAEmitterLayer
CAEmitterLayer是CoreAnimation框架中的粒子發(fā)射層。
請看相關鏈接:CAEmitter分析