iOS轉(zhuǎn)場(chǎng)動(dòng)畫(一)--自定義導(dǎo)航(Push, Pop)

自從iOS7開始開發(fā)者可以靈活的自定義轉(zhuǎn)場(chǎng)動(dòng)畫,而不必局限于子類化UINavigationController來完成自定義. 總的來說, 自定義轉(zhuǎn)場(chǎng)動(dòng)畫有兩種類型: 1. 子類化UINavigationControllerDelegate, 并自定義一個(gè)animator(實(shí)現(xiàn)animated delegate)在重寫協(xié)議中返回; 2. 讓轉(zhuǎn)場(chǎng)動(dòng)畫中的view controller(一般是目標(biāo)VC來實(shí)現(xiàn))實(shí)現(xiàn)UIViewControllerTransitioningDelegate, 并返回animator(與上同). 區(qū)分標(biāo)準(zhǔn)是哪個(gè)object控制動(dòng)畫, 當(dāng)我們想重寫push, pop等導(dǎo)航操作的時(shí)候, 就可以用到第一種方式來自定義; 第二種方式更加靈活, 不僅可以實(shí)現(xiàn)第一種的效果, 而且定制化程度更高(針對(duì)特定的VCs).

在這一篇中, 我們先來講解第一種方式: 通過子類化UINavigationControllerDelegate來自定義轉(zhuǎn)場(chǎng)動(dòng)畫. 先上效果圖:

效果圖

上文說道, 自定義轉(zhuǎn)場(chǎng)動(dòng)畫有2個(gè)關(guān)鍵點(diǎn):一個(gè)是重寫協(xié)議, 另一個(gè)就是創(chuàng)建自己的動(dòng)畫類. 我們先來看下要重寫那些協(xié)議:

 func navigationController(navigationController: UINavigationController, animationControllerForOperation
    operation: UINavigationControllerOperation, fromViewController fromVC: UIViewController, toViewController  
    toVC: UIViewController) -> UIViewControllerAnimatedTransitioning?{}
    
 func navigationController(navigationController: UINavigationController,
       interactionControllerForAnimationController animationController: 
       UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning?{} 

第一個(gè)要重寫的方法是返回一個(gè)實(shí)現(xiàn)了UIViewControllerAnimatedTransitioning delegate的動(dòng)畫object, 這個(gè)object定義了轉(zhuǎn)場(chǎng)時(shí)呈現(xiàn)給用戶的動(dòng)畫, 我們稍后再講; 第二個(gè)方法會(huì)返回一個(gè)UIPercentDrivenInteractiveTransition對(duì)象, 這個(gè)對(duì)象是控制用戶和動(dòng)畫交互的controller, 具體來說, 它控制著交互的百分比,存在周期是一個(gè)VC(fromVC)出現(xiàn)和另一個(gè)VC(toVC)消失期間。如果我們想支持用戶通過手勢(shì)進(jìn)行轉(zhuǎn)場(chǎng)的話, 這個(gè)object一定要有, 而且在手勢(shì)識(shí)別的target中添加action來同步更新UIPercentDrivenInteractiveTransition object的進(jìn)度.

下面來講動(dòng)畫. 自定義的動(dòng)畫是NSObject類型, 實(shí)現(xiàn)UIViewControllerAnimatedTransitioning協(xié)議中的2個(gè)方法:

 func transitionDuration(transitionContext: UIViewControllerContextTransitioning?) -> NSTimeInterval{}
 
 func animateTransition(transitionContext: UIViewControllerContextTransitioning){}

第一個(gè)方法是定義動(dòng)畫持續(xù)時(shí)間处渣;第二個(gè)就是定義具體的animation了椿每,代碼如下:

func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
  let toViewController: UIViewController = 
        transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)!
  let fromViewController: UIViewController =  
        transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey)!
    
  // Get container view from current transitioning context
  let containerView: UIView = transitionContext.containerView()!
  // Add dest view
  containerView.addSubview(toViewController.view)
    
  // Hide toVC first
  toViewController.view.alpha = 0
    
  UIView.animateWithDuration(self.transitionDuration(transitionContext), delay: 0, options: [.CurveLinear], animations: {
        () -> Void in
        // show to view controller
        toViewController.view.alpha = 1
        fromViewController.view.transform = CGAffineTransformMakeScale(0.1, 0.1)
 
        }) { (finished) -> Void in
            // Hide first view controller
            fromViewController.view.transform = CGAffineTransformIdentity
            // Must use transitionContext.transitionWasCancelled() to notify if the animation cancelled
            transitionContext.completeTransition(!transitionContext.transitionWasCancelled())
    }
}

該動(dòng)畫實(shí)現(xiàn)了轉(zhuǎn)場(chǎng)時(shí)toViewController透明度漸變?yōu)?, fromViewController scale縮小至原來的十分之一的動(dòng)畫過程倒彰。在這個(gè)方法里拉馋,我們可以自定義很多有創(chuàng)意的動(dòng)畫來完成自定義轉(zhuǎn)場(chǎng), 重點(diǎn)是toVC和fromVC的轉(zhuǎn)換以及生存周期懂鸵,當(dāng)前動(dòng)畫context.

代碼已上傳github, 純Swift實(shí)現(xiàn), <a >點(diǎn)擊這里獲取</a>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末卒煞,一起剝皮案震驚了整個(gè)濱河市痪宰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖衣撬,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乖订,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡具练,警方通過查閱死者的電腦和手機(jī)乍构,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扛点,“玉大人哥遮,你說我怎么就攤上這事×昃浚” “怎么了眠饮?”我有些...
    開封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長铜邮。 經(jīng)常有香客問我仪召,道長,這世上最難降的妖魔是什么松蒜? 我笑而不...
    開封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任扔茅,我火速辦了婚禮,結(jié)果婚禮上秸苗,老公的妹妹穿的比我還像新娘召娜。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著抠刺,像睡著了一般闷哆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼屯断。 笑死,一個(gè)胖子當(dāng)著我的面吹牛侣诺,可吹牛的內(nèi)容都是我干的殖演。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼年鸳,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼趴久!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起搔确,我...
    開封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤彼棍,失蹤者是張志新(化名)和其女友劉穎灭忠,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體座硕,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡弛作,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了华匾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片映琳。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蜘拉,靈堂內(nèi)的尸體忽然破棺而出萨西,到底是詐尸還是另有隱情,我是刑警寧澤旭旭,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布谎脯,位于F島的核電站,受9級(jí)特大地震影響持寄,放射性物質(zhì)發(fā)生泄漏穿肄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一际看、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧矢否,春花似錦仲闽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至验庙,卻和暖如春顶吮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背粪薛。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來泰國打工悴了, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人违寿。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓湃交,卻偏偏與公主長得像,于是被迫代替她去往敵國和親藤巢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子搞莺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容