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能夠為層提供移出以及移入屏幕的效果。蘋果提供的所有動畫類型在http://iphonedevwiki.net/index.php/CATransition這里有介紹,但是api只開放了其中的四種,當然你可以調用未公開的api,但是假如蘋果以后出於安全還是什么原因調整接口的話,就不一定能用了,所以最好還是不要調用私有api,況且還有許多可以替代的方法,例如@"flip”,@"pageCurl”這些type是屬於未公開的,一般來說不應該調用這些做動畫,下面的這句
1 [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文檔中得到的
1 CATransform3D aTransform = CATransform3DIdentity; 2 // the value of zDistance affects the sharpness of the transform.
3 zDistance = 850; 4 aTransform.m34 = 1.0 / -zDistance;
默認情況下, m34的值為0,即zDistance為無窮大,而(0,0,zDistance)點表示照相機(透視點)所在的位置,從照相機位置看到的影像在xy平面上的投影即是我們可以在手機屏幕中所看到的影像,下面的這個鏈接講的很詳細很准確,有興趣的可以去看。http://geeklu.com/2012/07/ios-3d-perspective/
上面講了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曲線。
說了這么多,大概知曉了動畫的原理,但是要做出很絢麗的動畫還是需要很好地數學功底及勤加修煉的。當然很多時候我們不能為了炫而炫,畢竟很多時候用戶使用應用是為了使用某個功能而不是專門來看動畫的。
啟動頁面,添加一個UIImageView,設置image為啟動屏圖片,然后對UIImageView進行動畫即可。
用UIView的animation就可以實現圖片切換動畫,以及歌詞平緩過渡動畫。
先對下一個controller進行截圖,然后進行動畫,動畫結束后顯示下一個controller即可。
通過CATransition設置type,subtype即可實現層的各種切換。