en

hi, it seems you are using microsoft internet explorer. it doesn't match web standard and causes problems browsing this site. please please please use mozilla firefox or google chrome instead. thank you!

zh

哦哦!您正在使用Internet Explorer 瀏覽器,它與我們的網頁標準並不相容,可能會導致畫面顯示不正常。
請改用 Mozilla Firefox 或者 Google Chrome 才能正常瀏覽本網站,謝謝!

8.23.2012

CATransition 過場動畫

  

CATransition 和 CABasicAnimation,同樣都是繼承於 CAAnimation 類別的一個物件,有別於 CABasicAnimation 繁瑣的動畫設定,CATransition 提供一種簡單容易使用的方式來製作過場動畫,由於少了複雜的設定,在動畫的種類上我們並沒有太多的選擇,下面就是 CATransition 過場動畫的使用方式。另外,有關 CABasicAnimation 的相關資訊,請前往本站的索引式搜索頁面中,輸入「CABasicAnimation」字串作查詢。

由於使用 CATransition 需要用到 UIView 中的 Layer 物件,所以必須要先對專案新增 QuartzCore.framework,並且引用對應的標頭檔。

以手動的方式替專案新增 QuartzCore.framework

#import < QuartzCore/QuartzCore.h>

對於新增 Framework 有問題的讀者們,請參考 Xcode 4 新增 Framework 的方法一文。


基本設定
關於 CATransition 過場動畫的設定,大家可以參考以下程式碼來實作。
//宣告一個CATransition
CATransition *transition = [CATransition animation];

//細部設定
[transition setDelegate:self];
[transition setDuration:1.0f];

//動畫內容
[transition setType:kCATransitionFade];
[transition setSubtype:kCATransitionFromRight];

//執行動畫
[[imageView layer] addAnimation:transition forKey:@"myTransition"];

在上述程式碼中,我們將此過場動畫 myTransition 套用在 imageView 上,並且持續 1  秒,動畫的內容為由右往左的 kCATransitionFade 效果。

在動畫內容的部份是由 setType 和 setSubtype 兩個設定參數來做決定,setType 決定了動畫的效果,像是翻頁、水波紋或是旋轉等,而 setSubtype 決定的是動畫的方向,你可以參考 CAAnimation.h 取得其他的設定參數。
//CAAnimation.h
/* Common transition types. */

CA_EXTERN NSString * const kCATransitionFade
__OSX_AVAILABLE_STARTING (__MAC_10_5, __IPHONE_2_0);
CA_EXTERN NSString * const kCATransitionMoveIn
__OSX_AVAILABLE_STARTING (__MAC_10_5, __IPHONE_2_0);
CA_EXTERN NSString * const kCATransitionPush
__OSX_AVAILABLE_STARTING (__MAC_10_5, __IPHONE_2_0);
CA_EXTERN NSString * const kCATransitionReveal
__OSX_AVAILABLE_STARTING (__MAC_10_5, __IPHONE_2_0);

/* Common transition subtypes. */

CA_EXTERN NSString * const kCATransitionFromRight
__OSX_AVAILABLE_STARTING (__MAC_10_5, __IPHONE_2_0);
CA_EXTERN NSString * const kCATransitionFromLeft
__OSX_AVAILABLE_STARTING (__MAC_10_5, __IPHONE_2_0);
CA_EXTERN NSString * const kCATransitionFromTop
__OSX_AVAILABLE_STARTING (__MAC_10_5, __IPHONE_2_0);
CA_EXTERN NSString * const kCATransitionFromBottom
__OSX_AVAILABLE_STARTING (__MAC_10_5, __IPHONE_2_0);

另外,除了上述 CAAnimation.h 中所定義的 4 種動畫效果外,還有一些其他特殊的動畫效果,你可以透過字串的方式輸入這些效果的名稱來產生動畫特效。
@" "             //漸隱(default)
@"suckEffect"    //刪除(MAC上視窗縮小至Dock的效果)
@"pageCurl"      //向上翻頁
@"pageUnCurl"    //向下翻頁
@"rippleEffect"  //水波紋
@"cube"          //立方體
@"oglFlip"       //翻轉
@"push"          //推移

ps:當輸入的效果字串錯誤時,就會以預設的漸隱效果來呈現,但是當輸入 「@""」 而非 「@" "」 時並不會產生任何動畫效果。


動畫開始和結束時的處理
在細部設定中,我們可以透過 setDelegate 方法來設定「實作動畫開始或是結束時的處理動作」的地方,在上述的步驟裡我們已經將實作的地方設定為自己本身的 Class,所以接下來只要實作以下兩個內建的方法函式即可。
//動畫開始時所觸發的內建方法函式
- (void)animationDidStart:(CAAnimation *)anim {
    [imageView setHidden:YES];
}

//動畫結束時所觸發的內建方法函式
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag {
    if (flag) {
        [imageView setHidden:NO];
    }
}

上述程式碼中,當動畫開始時我們會將 imageView 隱藏起來,以免畫面上同時出現兩個一樣的影像,而當動畫結束時才重新顯示隱藏的 imageView。


暫停與恢復動畫
過場動畫通常非常的短暫,但是還是有可能會需要使用到暫停與恢復的機制,透過仿造 CABasicAnimation 的暫停與恢復一文的方法,取得 CATransition 的執行時間,與設定 CATransition 過場動畫的開始位置,也可以實作出暫停與恢復動畫的機制(以下是部分的關鍵程式碼)。
//取得執行速度並停止動畫
float speed = [transition speed];
[transition setSpeed:0.0];

//取得動畫執行到現在所花費的時間
CFTimeInterval pausedTime = [transition timeOffset];

//設定動畫開始的位置
[transition setStartProgress:pausedTime];


其他的細部設定
當然 CATransition 的能做的設定不只上述這幾種,在 CATransition 中還包含著許多的細部設定,像是 setRepeatCount 設定動畫的重複次數,或是 setRemovedOnCompletion 在完成動畫之後即刪除該動畫的所有設定等,就不逐一介紹,如果大家有興趣可以親自嘗試看看。






沒有留言:

張貼留言