iOS 解決控制器轉(zhuǎn)場的一套方案

之前寫過了一篇關(guān)于 導(dǎo)航欄平滑過渡的實現(xiàn) 的文章鼓拧,主要實現(xiàn)的功能是在控制器轉(zhuǎn)場的過程當(dāng)中為導(dǎo)航欄實現(xiàn)平滑過渡的效果喻括∽尜欤回到控制器轉(zhuǎn)場本身來說,它還存在著以下幾個痛點:

  • 想通過手勢就可以輕松搞定向左或是向右滑動的 push 操作畴蒲。

  • 想通過手勢就可以完成相反方向的 pop 操作。

  • 可以靈活的控制轉(zhuǎn)場的功能。

源碼結(jié)構(gòu)

根據(jù)上述的幾個點實現(xiàn)了一個簡單的開源框架: XANavBarTransition 烦粒。在原有導(dǎo)航欄平滑過渡的基礎(chǔ)上,加上了一些轉(zhuǎn)場方面的功能并且最大程度的降低了對程序的入侵代赁。下面來簡單討論一下設(shè)計的思路扰她。

源碼結(jié)構(gòu)

設(shè)計思路

在設(shè)計之初,我想是通過全局的方式來控制導(dǎo)航控制器的轉(zhuǎn)場芭碍,后來在實現(xiàn)的過程中發(fā)現(xiàn)這種方式并不能讓我很好的去管理控制器與控制器之間的轉(zhuǎn)場調(diào)度徒役。這也是我在做 XANavBarTransition 框架時遇到的一個比較難處理的問題。最后拍板:將導(dǎo)航控制器棧中每一個控制器的交互轉(zhuǎn)場配合導(dǎo)航欄平滑過渡作為獨立的轉(zhuǎn)場方案(控制器管理著轉(zhuǎn)場會話的創(chuàng)建以及銷毀)窖壕,導(dǎo)航控制器仍然控制并且管理全局性的屬性和方法忧勿。

上面提到的轉(zhuǎn)場方案其實就是在控制器創(chuàng)建的時候用戶要選擇是進行向左還是向右的 push 操作,無論是哪種方式瞻讽,對應(yīng)相反的方向就是 pop 操作鸳吸。所有在控制器棧里的控制器皆是如此。同時還要確定定制化的功能速勇,比如:某個頁面我想有 push 功能晌砾、某個頁面我只想要有 pop 功能等等。

push 與 pop 的操作都是由內(nèi)部的具體的轉(zhuǎn)場對象來進行管理的烦磁,該對象會隨著控制器的顯示而創(chuàng)建贡羔,消失而銷毀廉白。所以它在每次創(chuàng)建的時候會根據(jù)轉(zhuǎn)場方案來進行相應(yīng)的子類化。

在最開始的時候是想通過系統(tǒng)自帶的 pop 功能來完成乖寒,后來發(fā)現(xiàn)對其控制力不足猴蹂。push 與 pop 具體的實現(xiàn)思路其實很簡單都是通過對控制器添加手勢,根據(jù)轉(zhuǎn)場的方案和滑動方向來確定是 push 操作還是 pop 操作,并驅(qū)動相應(yīng)的交互式的轉(zhuǎn)場動畫楣嘁。

下面是一段手勢識別的代碼:

- (BOOL)gestureRecognizerShouldBegin:(UIPanGestureRecognizer *)gestureRecognizer{
    if(gestureRecognizer == self.interactivePan){
        CGPoint point     = [gestureRecognizer translationInView:nil];
        CGPoint velocity  = [gestureRecognizer velocityInView:nil];
        if (fabs(velocity.y) > fabs(velocity.x)) {//垂直方向不處理
            return NO;
        }
        if(self.nc.xa_isTransitioning){
            return NO;
        }
        if([self getPushCondition:point]){//push
            self.nextVC = [self.transitionDelegate xa_nextViewControllerInTransitionMode:self.transitionMode];//是否為有效的push控制器
            if(self.nextVC  == nil ||
               [self.nc.childViewControllers containsObject:self.nextVC]){
                return NO;
            }
            return self.pushTransitionEnable;
        }else if([self getPopCondition:point]){//pop
            if(self.nc.viewControllers.count <= 1){//棧底控制器不處理
                return NO;
            }
            return self.popTransitionEnable;
        }
        return NO;
    }
    return YES;
}

狀態(tài)控制

XANavBarTransition 框架中主要有以下幾個狀態(tài)的控制磅轻。

  • 每一個控制器都擁有能否 pop 的能力,這個功能會在手勢識別階段完成。

  • 可以控制當(dāng)前導(dǎo)航控制器下的所有控制器的轉(zhuǎn)場功能逐虚。這個功能會在創(chuàng)建轉(zhuǎn)場會話和設(shè)置屬性的階段完成聋溜。

  • 代理回調(diào): XANavigationControllerObserver 對象負責(zé)監(jiān)聽 <UINavigationControllerDelegate> 代理方法。如果App外部有需要監(jiān)聽,可以將實現(xiàn)了 <UINavigationControllerDelegate> 協(xié)議的代理設(shè)置到導(dǎo)航控制器的 xa_delegate屬性當(dāng)中,內(nèi)部會做轉(zhuǎn)遞叭爱。

結(jié)尾

如果大家在框架的使用中有什么問題歡迎給我提 issues 或者 @關(guān)于嵐撮躁。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市买雾,隨后出現(xiàn)的幾起案子把曼,更是在濱河造成了極大的恐慌,老刑警劉巖漓穿,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嗤军,死亡現(xiàn)場離奇詭異,居然都是意外死亡晃危,警方通過查閱死者的電腦和手機叙赚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來僚饭,“玉大人震叮,你說我怎么就攤上這事△⑼遥” “怎么了冤荆?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長权纤。 經(jīng)常有香客問我钓简,道長,這世上最難降的妖魔是什么汹想? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任外邓,我火速辦了婚禮,結(jié)果婚禮上古掏,老公的妹妹穿的比我還像新娘损话。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布丧枪。 她就那樣靜靜地躺著光涂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拧烦。 梳的紋絲不亂的頭發(fā)上忘闻,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天,我揣著相機與錄音恋博,去河邊找鬼齐佳。 笑死,一個胖子當(dāng)著我的面吹牛债沮,可吹牛的內(nèi)容都是我干的炼吴。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼疫衩,長吁一口氣:“原來是場噩夢啊……” “哼硅蹦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起闷煤,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤童芹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后曹傀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡饲宛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年皆愉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片艇抠。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡幕庐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出家淤,到底是詐尸還是另有隱情异剥,我是刑警寧澤,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布絮重,位于F島的核電站冤寿,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏青伤。R本人自食惡果不足惜督怜,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望狠角。 院中可真熱鬧号杠,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至眼溶,卻和暖如春悠砚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背偷仿。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工哩簿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人酝静。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓节榜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親别智。 傳聞我的和親對象是個殘疾皇子宗苍,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,678評論 2 354

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