iOS官方轉(zhuǎn)場(chǎng)原理
iOS開(kāi)發(fā)里肯定少不了各種轉(zhuǎn)場(chǎng),切換控制器視圖.但有時(shí)候我們想自己寫(xiě)點(diǎn)比較絢麗的效果的轉(zhuǎn)場(chǎng),這時(shí)候我們就需要了解蘋(píng)果官方轉(zhuǎn)場(chǎng)的原理了.看了大神們的博客,希望自己用最口述話的語(yǔ)言來(lái)說(shuō)一說(shuō)讓自己印象更深刻一下.
(1)轉(zhuǎn)場(chǎng)是什么意思,其實(shí)就是控制器視圖的切換.轉(zhuǎn)場(chǎng)需要做什么呢?無(wú)非就是把第一個(gè)控制器的視圖移除視線,把第二個(gè)試圖控制器的視圖顯示出來(lái).中間加上我們需要的動(dòng)畫(huà)效果.以后我們把第一個(gè)控制器叫做fromVC,第二個(gè)叫做toVC.
(2)根據(jù)蘋(píng)果的規(guī)則,我們會(huì)安排一下幾個(gè)角色完成轉(zhuǎn)場(chǎng).1.動(dòng)畫(huà)控制器2交互控制器3,轉(zhuǎn)場(chǎng)代理4.轉(zhuǎn)場(chǎng)上下文5.轉(zhuǎn)場(chǎng)容器.這些角色里轉(zhuǎn)場(chǎng)上下文起到特別重要的數(shù)據(jù)源和處理作用.
(3)我們講講他們5個(gè)怎么配合的,首先轉(zhuǎn)場(chǎng)容器是相當(dāng)于父容器把要fromVC和toVC管理起來(lái),一開(kāi)始fromVC在轉(zhuǎn)場(chǎng)容器里,容器想我該怎么轉(zhuǎn)場(chǎng)啊,這時(shí)候轉(zhuǎn)場(chǎng)代理來(lái)了,說(shuō)我給你提供轉(zhuǎn)場(chǎng)動(dòng)畫(huà),還可以幫你解決交互.但是你得把要切換的東西給我.要不然我巧婦難為無(wú)米之炊啊.轉(zhuǎn)場(chǎng)容器說(shuō)好的.我把一切東西都給了轉(zhuǎn)場(chǎng)上下文,你去向它要.然后,轉(zhuǎn)場(chǎng)代理從轉(zhuǎn)場(chǎng)上下文那里拿到數(shù)據(jù),給動(dòng)畫(huà)控制器說(shuō),東西都在這了,你給我做好看點(diǎn).給交互控制器說(shuō)東西也給你了,讓手勢(shì)和動(dòng)畫(huà)控制器都去配合你,把工作做好.這是他們的關(guān)系.
(4)需要特別注意的是,角色的實(shí)現(xiàn),蘋(píng)果都給了需要的協(xié)議,就是說(shuō)蘋(píng)果官方,已經(jīng)告訴我們,這幾個(gè)角色應(yīng)該要辦什么事做什么工作才能稱職.動(dòng)畫(huà)控制器需要遵守的<UIViewControllerAnimatedTransitioning>這個(gè)協(xié)議需要我們實(shí)現(xiàn)
1.動(dòng)畫(huà)的時(shí)間.
2.動(dòng)畫(huà)的效果.
交互控制器需要實(shí)現(xiàn)的<UIViewControllerInteractiveTransitioning>這個(gè)協(xié)議需要我們實(shí)現(xiàn).
1.更新動(dòng)畫(huà)的進(jìn)程.
2.完成轉(zhuǎn)場(chǎng).
3.取消轉(zhuǎn)場(chǎng).(因?yàn)榻换マD(zhuǎn)場(chǎng)中途可能取消,比如你劃了一半不劃了)
轉(zhuǎn)場(chǎng)代理實(shí)現(xiàn)的方法就是提供動(dòng)畫(huà)控制器和交互控制器,蘋(píng)果也提供代理了,有<UITabBarControllerDelegate><UINavigationControllerDelegate><UIViewControllerTransitioningDelegate>
轉(zhuǎn)場(chǎng)上下文需要實(shí)現(xiàn)的方法就比較多了,蘋(píng)果也給出了一套協(xié)議幫助我們<UIViewControllerContextTransitioning>方法有14個(gè).
1返回轉(zhuǎn)場(chǎng)容器視圖
2是否支持動(dòng)畫(huà)
3是否支持交互
4是否取消了轉(zhuǎn)場(chǎng)
5轉(zhuǎn)場(chǎng)的模式
6更新轉(zhuǎn)場(chǎng)進(jìn)度(用在交互轉(zhuǎn)場(chǎng)中)
7完成交互轉(zhuǎn)場(chǎng)
8取消交互轉(zhuǎn)場(chǎng)
9轉(zhuǎn)場(chǎng)結(jié)束
10獲取轉(zhuǎn)場(chǎng)控制器
11獲取轉(zhuǎn)場(chǎng)控制器視圖
12目標(biāo)轉(zhuǎn)換
13開(kāi)始frame
14結(jié)束frame
(5)轉(zhuǎn)場(chǎng)可以說(shuō)是分為兩類,一類是UINavigationController切換和UITabBarController切換,另一類是modal切換.他們最大的不同是,前者,提供容器UINavigationController/UITabBarController,切換視圖的時(shí)候把fromVC及視圖移除,把toVC及視圖添加進(jìn)來(lái).而modal切換,fromVC和toVC是UIKit進(jìn)行管理的.在present的時(shí)候fromVC視圖并沒(méi)有移除原來(lái)的視圖結(jié)構(gòu),所以在dismissal時(shí)也不用再加進(jìn)來(lái).
這里只是我只是大概說(shuō)一下自己的理解,比較具體的實(shí)現(xiàn)機(jī)制,可以看看代碼.
前人寫(xiě)的swift版的Demo,這里是我充當(dāng)搬運(yùn)工做的OC版本的Demo