天天看點

QuartzCore架構簡介

QuartzCore架構

iOS裝置給使用者視覺回報其實都是通過QuartzCore架構來進行的,說白了,所有使用者最終看到的顯示界面都是圖層合成的結果,而圖層即是QuartzCore中的CALayer。

通常我們所說的視圖即UIView,并不是直接顯示在螢幕上,而是在建立視圖對象的時候視圖對象會自動建立一個層,而視圖對象把要顯示的東西繪制在層上,待到需要顯示時硬體将所有的層拷貝,然後按Z軸的高低合成最終的顯示結果。

CALayer本質上是一塊包含一幅位圖的緩沖區,由視圖建立的層為隐式層,而手動建立的層稱為顯示層。

如果要在iOS上能夠有良好的使用者體驗,動畫的過渡效果是必不可少的,而所有的動畫效果都是通過CAAnimation類的子類(CAAnimation是抽象類)來完成的。CAAnimation類的子類包括了CAAnimationGroup,CAPropertyAnimation,CATransition,而CAPropertyAniamtion(同為抽象類)也衍生了CABasicAnimation和CAKeyframeAnimation。用UIView的animation實作的動畫本質上也是通過CALayer來實作的,iOS系統中CALayer的很多屬性都是隐含有動畫效果的,如果不想要隐式動畫或者想要顯示動畫效果,都可以通過CATransaction來設定是否顯示動畫效果。同時,在CATransaction内可同時修改多個屬性,然後再一并同時渲染,另外CATransaction還是可嵌套的。

  CABasicAnimation是一個最多隻能有兩個關鍵幀的動畫,而CAKeyframeAnimation除了可含有多個關鍵幀,而且還可以修改每個關鍵幀的速度。

  CATransition能夠為層提供移出以及移入螢幕的效果。蘋果提供的所有動畫類型在這裡有介紹,但是api隻開放了其中的四種,當然你可以調用未公開的api,但是假如蘋果以後出于安全還是什麼原因調整接口的話,就不一定能用了,是以最好還是不要調用私有api,況且還有許多可以替代的方法,例如@”flip”,@”pageCurl”這些type是屬于未公開的,一般來說不應該調用這些做動畫,下面的這句:

[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:containerView cache:YES];
           

同樣也可實作翻轉的效果。再不行的話,還可以通過設定@”transform.rotation.y”這個keypath來旋轉,或者直接通過CATransform3D來設定@”transform”屬性。總而言之,沒必要用未公開的api,會留下隐患,而且替代的方法很多。

變換過程中需要注意的是該CALayer的anchorPoint,也就是旋轉縮放基準點,預設情況下是(0.5, 0.5)也就是在layer的中心。基準點如果變了,旋轉或者縮放所得到的的結果将會不同。position和anchorPoint共同決定了CALayer的frame。

再說說CATransform3D的一個很常用到的數值,那就是m34這個值,下面這段代碼是從Xcode文檔中得到的:

CATransform3D aTransform = CATransform3DIdentity;
 // the value of zDistance affects the sharpness of the transform.
 zDistance = ;
 aTransform.m34 =  / -zDistance;
           

預設情況下, m34的值為0,即zDistance為無窮大,而(0,0,zDistance)點表示照相機(透視點)所在的位置,從照相機位置看到的影像在xy平面上的投影即是我們可以在手機螢幕中所看到的影像。

  上面講了iOS裡面所有的動畫,但是還有一個很重要的沒有講,那就是動畫的速度控制函數CAMediaTimingFunction。這個函數是用于描述時間和距離之間的關系,距離=toValue-fromValue, 時間=duration, 将它們标準化為1x1的空間,x,t取值在[0, 1]區間内。假設在時刻t(時間過去了duration*t)時,動畫目标的位置應為 fromValue+x*(toValue-fromValue)。系統提供的四種函數的函數圖如下,下面曲線的斜率表示動畫的速率,從圖中可以看出,kCAMediaTimingFunctionLinear為勻速運動,kCAMediaTimingFunctionEaseIn為加速運動,kCAMediaTimingFunctionEaseOut為減速運動,kCAMediaTimingFunctionEaseInEaseOut為先加速後減速運動。當然,蘋果也提供了可自定義速度控制函數,通過initWithControlPoints:x1:y1:x2:y2可自定義兩個插值點,然後所得的函數曲線為由(0,0),(x1,y1),(x2,y2),(1,1)這四個點為控制點的Bezier曲線。

QuartzCore架構簡介

說了這麼多,大概知曉了動畫的原理,但是要做出很絢麗的動畫還是需要很好地數學功底及勤加修煉的。當然很多時候我們不能為了炫而炫,畢竟很多時候使用者使用應用是為了使用某個功能而不是專門來看動畫的。