在swift中實(shí)現(xiàn)自定義轉(zhuǎn)場(chǎng)動(dòng)畫

1.需求確認(rèn)

? ? ? 在HomeViewController中, 點(diǎn)擊TitleButton, 通過(guò)自定義轉(zhuǎn)場(chǎng)動(dòng)畫的方式modal出一小塊的PopoverViewController

2.類索引

? ? ? 1) HomeViewController : BaseViewController
-- "源控制器", 負(fù)責(zé)發(fā)起自定義轉(zhuǎn)場(chǎng)
? ? ? 2) PopoverViewController : UIViewController
-- "目標(biāo)控制器", 通過(guò)自定義轉(zhuǎn)場(chǎng)而被展現(xiàn)
? ? ? 3) PopoverPresentationController : UIPresentationController
-- "轉(zhuǎn)場(chǎng)控制器", 負(fù)責(zé)配置自身容器屬性, 將目標(biāo)控制器的view添加到容器中, 容器本質(zhì)也是一個(gè)view
? ? ? 4) PopoverAnimator : NSObject
-- 自定義轉(zhuǎn)場(chǎng)動(dòng)畫類, 用于將下面兩個(gè)代理中的方法從源控制器中進(jìn)行抽離, 使源控制器只保留邏輯代碼, 保證其代碼的整潔和優(yōu)雅
? ? ? 5) UIViewControllerTransitioningDelegate
?-- 常用三個(gè)代理方法, 用于告訴系統(tǒng)誰(shuí)是轉(zhuǎn)場(chǎng)控制器, 誰(shuí)負(fù)責(zé)轉(zhuǎn)場(chǎng)動(dòng)畫的開始, 誰(shuí)負(fù)責(zé)轉(zhuǎn)場(chǎng)動(dòng)畫的結(jié)束
? ? ? 6) UIViewControllerAnimatedTransitioning
-- 常用兩個(gè)代理方法, 用于告訴系統(tǒng)轉(zhuǎn)場(chǎng)動(dòng)畫的持續(xù)時(shí)間與實(shí)現(xiàn)

3.實(shí)現(xiàn)步驟


1) 設(shè)置目標(biāo)控制器的代理對(duì)象

popoverViewController.transitioningDelegate = 自定義轉(zhuǎn)場(chǎng)動(dòng)畫類的實(shí)例化對(duì)象

2) 設(shè)置目標(biāo)控制器的轉(zhuǎn)場(chǎng)樣式

popoverViewController.modalPresentationStyle= UIModalPresentationStyle.Custom

3) 自定義轉(zhuǎn)場(chǎng)控制器類 PopoverPresentationController : UIPresentationController
在這個(gè)類中, 著重使用了兩個(gè)屬性, 并重寫兩個(gè)方法:

containerView : 容器屬性, 所有被展現(xiàn)的東西都在這個(gè)view內(nèi)部
presentedView() : 返回目標(biāo)控制器的view

init(presentedViewController, presentingViewController)
初始化方法, 記得調(diào)用'super.'對(duì)父類初始化
第一個(gè)參數(shù): 目標(biāo)控制器
第二個(gè)參數(shù): 在Xcode6為nil, Xcode7為野指針

containerViewWillLayoutSubviews()
容器布局方法, 該方法會(huì)在轉(zhuǎn)場(chǎng)前進(jìn)行調(diào)用, 對(duì)容器內(nèi)的視圖進(jìn)行統(tǒng)一配置(包括: 目標(biāo)控制器的view.frame蟀拷、coverView等)

4) 實(shí)現(xiàn)UIViewControllerTransitioningDelegate的最主要代理方法

presentationControllerForPresentedViewController(presented,presenting, source)
-> UIPresentationController?
該代理方法告訴系統(tǒng), 誰(shuí)是轉(zhuǎn)場(chǎng)控制器
參數(shù)一: 目標(biāo)控制器
參數(shù)二: 在Xcode6為nil, Xcode7為野指針
參數(shù)三: 源控制器
返回值: 轉(zhuǎn)場(chǎng)控制器

5) 實(shí)現(xiàn)UIViewControllerTransitioningDelegate的另外兩個(gè)代理方法

animationControllerForPresentedController(presented, presenting, source)
-> UIViewControllerAnimatedTransitioning?
該代理方法告訴系統(tǒng), 誰(shuí)負(fù)責(zé)轉(zhuǎn)場(chǎng)動(dòng)畫的展現(xiàn), 在展現(xiàn)開始前被調(diào)用
返回值: 簽訂UIViewControllerAnimatedTransitioning協(xié)議的對(duì)象, 這里返回轉(zhuǎn)場(chǎng)動(dòng)畫類

animationControllerForDismissedController(dismissed)
-> UIViewControllerAnimatedTransitioning?
該代理方法告訴系統(tǒng), 誰(shuí)負(fù)責(zé)轉(zhuǎn)場(chǎng)動(dòng)畫的消失, 在消失開始前被調(diào)用
返回值: 簽訂UIViewControllerAnimatedTransitioning協(xié)議的對(duì)象, 這里返回轉(zhuǎn)場(chǎng)動(dòng)畫類

6) 實(shí)現(xiàn)UIViewControllerAnimatedTransitioning的兩個(gè)代理方法

transitionDuration(transitionContext) ->NSTimeInterval
該代理方法告訴系統(tǒng), 轉(zhuǎn)場(chǎng)動(dòng)畫的執(zhí)行時(shí)間

animateTransition(transitionContext)
在該代理方法中完成動(dòng)畫的實(shí)現(xiàn), 無(wú)論展現(xiàn)還是消失,都會(huì)調(diào)用這個(gè)方法
參數(shù): transitionContext, 里面包含了動(dòng)畫需要的所有參數(shù)!
通過(guò) transitionContext.viewControllerForKey(key) 獲取目標(biāo)控制器和源控制器
通過(guò) transitionContext.viewForKey(key) 獲取展現(xiàn)的view和消失的view
通過(guò) transitionContext.containerView 獲取轉(zhuǎn)場(chǎng)控制器的容器屬性
通過(guò) transitionDuration(transitionContext) 設(shè)置動(dòng)畫持續(xù)時(shí)間
通過(guò) transitionContext.completeTransition(true), 動(dòng)畫完成時(shí)告訴系統(tǒng), 該步必須有!

7) 一切準(zhǔn)備就緒, 調(diào)用modal方法吧

presentViewController(homeVC, animated:true, completion:nil)

4.注意事項(xiàng)


1) 自定義轉(zhuǎn)場(chǎng)需要iOS8以上版本?

2) 默認(rèn)轉(zhuǎn)場(chǎng)會(huì)將源控制器的view替換成目標(biāo)控制器的view, 而自定義轉(zhuǎn)場(chǎng),不會(huì)移除源控制器的view

3) 重寫步驟5和6里面的代理方法后, 系統(tǒng)自帶的轉(zhuǎn)場(chǎng)動(dòng)畫(從下至上)就已經(jīng)沒有了

4) 在代理方法animateTransition(transitionContext)中, 通過(guò)使用transitionContext.viewForKey(key)獲取到要展現(xiàn)的視圖后,一定要將其添加到容器中,?否則彈窗彈不出來(lái)!

5) 在轉(zhuǎn)場(chǎng)動(dòng)畫完成后, 一定要調(diào)用transitionContext.completeTransition(true), 否則會(huì)產(chǎn)生各種未知的問(wèn)題(如同在layoutSubviews()中不調(diào)用super一樣)

6) 在UIView.animateWithDuration()中, 如果調(diào)用了CGAffineTransformMakeScale等參數(shù)類型為CGFloat的方法, 填0.0會(huì)沒有動(dòng)畫, 由于系統(tǒng)缺陷導(dǎo)致CGFloat類型是不準(zhǔn)確的.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末寸癌,一起剝皮案震驚了整個(gè)濱河市毕泌,隨后出現(xiàn)的幾起案子摔癣,更是在濱河造成了極大的恐慌驳糯,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,464評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秩冈,死亡現(xiàn)場(chǎng)離奇詭異萌庆,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)沙咏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門扰她,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人芭碍,你說(shuō)我怎么就攤上這事徒役。” “怎么了窖壕?”我有些...
    開封第一講書人閱讀 169,078評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵忧勿,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我瞻讽,道長(zhǎng)鸳吸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,979評(píng)論 1 299
  • 正文 為了忘掉前任速勇,我火速辦了婚禮晌砾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘烦磁。我一直安慰自己养匈,他們只是感情好哼勇,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著呕乎,像睡著了一般积担。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上猬仁,一...
    開封第一講書人閱讀 52,584評(píng)論 1 312
  • 那天帝璧,我揣著相機(jī)與錄音,去河邊找鬼湿刽。 笑死的烁,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的诈闺。 我是一名探鬼主播渴庆,決...
    沈念sama閱讀 41,085評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼买雾!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起杨帽,我...
    開封第一講書人閱讀 40,023評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤漓穿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后注盈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體晃危,經(jīng)...
    沈念sama閱讀 46,555評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評(píng)論 3 342
  • 正文 我和宋清朗相戀三年老客,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了僚饭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,769評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡胧砰,死狀恐怖鳍鸵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情尉间,我是刑警寧澤偿乖,帶...
    沈念sama閱讀 36,439評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站哲嘲,受9級(jí)特大地震影響贪薪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜眠副,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評(píng)論 3 335
  • 文/蒙蒙 一画切、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧囱怕,春花似錦霍弹、人聲如沸毫别。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)拧烦。三九已至,卻和暖如春钝计,著一層夾襖步出監(jiān)牢的瞬間恋博,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工私恬, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留债沮,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,191評(píng)論 3 378
  • 正文 我出身青樓本鸣,卻偏偏與公主長(zhǎng)得像疫衩,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子荣德,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評(píng)論 2 361

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