相關(guān)資源
GitHub粒子發(fā)射和復(fù)制圖層示例
GitHub粘性控件示例
GitHub彈性動(dòng)畫
響應(yīng)者手勢(shì)分析
CAEmitter分析
簡(jiǎn)介
這是一個(gè)什么對(duì)象呢桶蛔,官方簡(jiǎn)述起是一個(gè)管理基于圖像內(nèi)容的對(duì)象假夺,并且允許你在內(nèi)容上執(zhí)行動(dòng)畫满葛。我們一直通俗的理解就是它的作用就是用于顯示的绊诲。在UIKit繼承樹中我們可以發(fā)現(xiàn)只有UIView中有l(wèi)ayer屬性夺颤。
層通常被用在對(duì)View的輔助處理祠肥,但也可以直接使用顯示內(nèi)容鸵闪。一個(gè)層的主要工作是管理您提供的可視化內(nèi)容,但層本身具有可設(shè)置的可視屬性概疆,如背景顏色逗威、邊框和陰影。除了管理視覺內(nèi)容外岔冀,該層還保存有關(guān)其內(nèi)容的幾何信息(如它的位置凯旭、大小和轉(zhuǎn)換),這些幾何信息決定著內(nèi)容在屏幕上的展現(xiàn)。一個(gè)layer對(duì)象通過遵守CAMediaTiming協(xié)議 封裝了時(shí)間罐呼、layer的節(jié)奏和它的動(dòng)畫鞠柄,因?yàn)镃AMediaTiming協(xié)議定義了層的定時(shí)信息。
如果圖層對(duì)象是由視圖創(chuàng)建的嫉柴,視圖通常會(huì)自動(dòng)將其作為層的代理厌杜,并且這種關(guān)系不應(yīng)該被強(qiáng)制改變。對(duì)于創(chuàng)建自己的層计螺,可以制定一個(gè)它的代理對(duì)象夯尽,可以使用該代理動(dòng)態(tài)地為層提供內(nèi)容,并執(zhí)行其他任務(wù)登馒。一層也有一個(gè)布局管理器對(duì)象(分配到的布局管理器的屬性)來管理子視圖的布局分開匙握。
基本注意點(diǎn)
- 對(duì)于非根層具有隱式動(dòng)畫(對(duì)于可動(dòng)畫的屬性)
- 對(duì)圖層的操作非常豐富,可查看屬性陈轿,設(shè)置各種效果
- 繼承自nsoject肺孤,不具有responder相應(yīng)的屬性
- layer.transform的類型是CATransform3D(QuartzCore框架),view.transform的類型是CGAffineTransform(CoreGraphics框架)济欢,對(duì)兩者的transform屬性操作會(huì)影響兩個(gè)的frame(兩個(gè)frame是同步的赠堵,view的frame決定它的responder范圍)。
- position屬性相當(dāng)于view.center(這兩個(gè)值經(jīng)測(cè)試是同步的)法褥,這兩個(gè)值得改變不僅可以通過直接設(shè)值茫叭,還可以通過重新設(shè)置frame重新調(diào)整其值(這種情況下要根據(jù)anchor值系統(tǒng)給出相應(yīng)的值)。
- anchorPoint 默認(rèn)是0.5半等,0.5 揍愁,改變transform 和frame不會(huì)影響它,只有通過設(shè)置anchorPoint屬性才會(huì)改變杀饵。
- 當(dāng)layer.tansform存在時(shí)莽囤,不要重新設(shè)置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)和縮放(相當(dāng)于改變bounds值)的時(shí)候會(huì)圍繞position(也就是view的center屬相)做調(diào)整切距,改變frame值朽缎。
說明:這里的情況是UIKit層面的動(dòng)畫或者沒有動(dòng)畫處理情況。
核心動(dòng)畫 (這里扯一下CoreAnimation)
- UIView動(dòng)畫與核心動(dòng)畫的區(qū)別?
- 核心動(dòng)畫只作用在layer.
- 核心動(dòng)畫修改的值都是假像.它的真實(shí)位置沒有發(fā)生變化谜悟,不會(huì)改變layer的frame话肖、transform屬性.
- 什么時(shí)候用UIView動(dòng)畫什么時(shí)候用核心動(dòng)畫?
- 當(dāng)需要與用戶進(jìn)行交互時(shí)用UIView,不需要與用戶進(jìn)行交互時(shí)兩個(gè)都可以.
- 什么情況用核心動(dòng)畫最多?
- 轉(zhuǎn)場(chǎng)動(dòng)畫(UIView的轉(zhuǎn)場(chǎng)動(dòng)畫類型比較少).
- 幀動(dòng)畫.
- 動(dòng)畫組.
CALayer介紹
QuartzCore框架之中的一個(gè)重要的類,QuartzCore中另外一個(gè)重要的類就是CoreAnimation葡幸。這篇就來介紹一下CALayer的幾個(gè)重要的子類:
- CAGradientLayer
漸變層在其背景色上繪制顏色漸變最筒,填充層的形狀(包括圓角)。
// 添加或者獲取需要漸變的顏色蔚叨,顏色的類型是CGColorRef床蜘,數(shù)組默認(rèn)是nil
@property(nullable, copy) NSArray *colors;
// 起始點(diǎn)不僅能夠決定漸變的起始點(diǎn)辙培,而且可以確定漸變方向
@property CGPoint startPoint;
@property CGPoint endPoint;
// 在起始點(diǎn)的基礎(chǔ)上確定每一個(gè)漸變站的位置
@property(nullable, copy) NSArray<NSNumber *> *locations;
- CAReplicatorLayer
CAReplocatorLayer是復(fù)制圖層,我們可以通過它邢锯,將其中的子layer進(jìn)行拷貝虏冻,并進(jìn)行一些差異處理。我們只需要對(duì)源圖層進(jìn)行處理(包括動(dòng)畫弹囚,形變,位移)领曼,在CAReplocatorLayer的作用下副本就會(huì)被原樣處理
//拷貝的次數(shù)(包括源圖層)
@property NSInteger instanceCount;
//是否開啟景深效果
@property BOOL preservesDepth;
//當(dāng)CAReplicatorLayer的子Layer層進(jìn)行動(dòng)畫的時(shí)候鸥鹉,拷貝的副本執(zhí)行動(dòng)畫的延時(shí)
@property CFTimeInterval instanceDelay;
//拷貝副本的3D變換
@property CATransform3D instanceTransform;
//拷貝副本的顏色變換
@property(nullable) CGColorRef instanceColor;
//每個(gè)拷貝副本的顏色偏移參數(shù)
- CAShapeLayer
CAShapeLayer是圖形圖層,我們可以自定義這個(gè)層的形狀庶骄。
// 圖層形狀路徑
@property(nullable) CGPathRef path;
//設(shè)置圖形的填充顏色
@property(nullable) CGColorRef fillColor;
/*
設(shè)置圖形的填充規(guī)則 選項(xiàng)如下:
非零填充
NSString *const kCAFillRuleNonZero;
奇偶填充
NSString *const kCAFillRuleEvenOdd;
*/
@property(copy) NSString *fillRule;
//設(shè)置Stroke線條顏色
@property(nullable) CGColorRef strokeColor;
//設(shè)置線條的起點(diǎn)與終點(diǎn) 0-1之間毁渗,默認(rèn)是0和1
@property CGFloat strokeStart;
@property CGFloat strokeEnd;
//設(shè)置線條寬度
@property CGFloat lineWidth;
//設(shè)置兩條線段相交時(shí)銳角斜面長度(斜接限制)
@property CGFloat miterLimit;
/*
設(shè)置線條首尾的外觀
可選如下
NSString *const kCALineCapButt;無形狀
NSString *const kCALineCapRound;圓形
NSString *const kCALineCapSquare;方形
*/
@property(copy) NSString *lineCap;
/*
設(shè)置線段的鏈接方式
NSString *const kCALineJoinMiter;棱角
NSString *const kCALineJoinRound; 平滑
NSString *const kCALineJoinBevel;折線
*/
@property(copy) NSString *lineJoin;
//設(shè)置從哪個(gè)階段開始,例如: layer.lineDashPhase = 5;
@property CGFloat lineDashPhase;
//stroke線條的屬性单刁,畫虛線(lineDash)
// 例如:layer.lineDashPattern = @[@05,@10,@2]; 表示實(shí)(5) 虛(10)實(shí)(2)循環(huán)劃線灸异。
@property(nullable, copy) NSArray<NSNumber *> *lineDashPattern;
簡(jiǎn)單應(yīng)用:粘性控件(GitHub地址)
- CATextLayer
文本層提供簡(jiǎn)單的文本布局和普通字符串或者屬性字符串的渲染,第一行與圖層的頂部對(duì)齊羔飞。
//渲染的文字字符串
@property(nullable, copy) id string;
//設(shè)置字體
@property(nullable) CFTypeRef font;
//設(shè)置字號(hào)
@property CGFloat fontSize;
//設(shè)置文字顏色
@property(nullable) CGColorRef foregroundColor;
//是否換行
@property(getter=isWrapped) BOOL wrapped;
//
無截?cái)嗄J?br>
NSString * const kCATruncationNone;
截?cái)嗲安糠?br>
NSString * const kCATruncationStart;
截?cái)嗪蟛糠?br>
NSString * const kCATruncationEnd;
截?cái)嘀虚g
NSString * const kCATruncationMiddle;
@property(copy) NSString *truncationMode;
//
設(shè)置文字對(duì)齊模式
NSString * const kCAAlignmentNatural;
NSString * const kCAAlignmentLeft;
NSString * const kCAAlignmentRight;
NSString * const kCAAlignmentCenter;
NSString * const kCAAlignmentJustified;
@property(copy) NSString *alignmentMode;
- CAEmitterLayer
CAEmitterLayer是CoreAnimation框架中的粒子發(fā)射層肺樟。
請(qǐng)看相關(guān)鏈接:CAEmitter分析