圖解實(shí)現(xiàn)UINavigation的全屏右滑功能

簡介:對(duì)于在使用的UINavigation, 蘋果原生自帶屏幕邊緣右滑功能,性能非常好,但太過于雞肋.

本文主要分析蘋果右滑的實(shí)現(xiàn),以及實(shí)現(xiàn)全屏右滑.

* 首先看下蘋果的邊緣右滑
2016-04-03 at 上午12.08.gif

小結(jié):

    1.0 系統(tǒng)實(shí)現(xiàn)屏幕右滑,因?yàn)槠溆幸皇謩?shì)
    UIGestureRecognizer *interactivePopGestureRecognizer;

    2.0 只能邊緣右滑,是應(yīng)為其手勢(shì)是邊緣觸發(fā)型手勢(shì);
    打印該手勢(shì):
    NSLog(@"%@", self.interactivePopGestureRecognizer);

    輸出:
     <UIScreenEdgePanGestureRecognizer: 0x7fae4ad5d6f0; state = Possible; delaysTouchesBegan = YES; view = <UILayoutContainerView 0x7fae4ad5bbf0>; target= <(action=handleNavigationTransition:, target=<_UINavigationInteractiveTransition 0x7f9858e96120>)>>

解析:蘋果怎么實(shí)現(xiàn)右滑?

  • 手勢(shì)類型:UIScreenEdgePanGestureRecognizer(邊緣時(shí)才會(huì)觸發(fā)手勢(shì))
  • 觸發(fā)手勢(shì)時(shí),對(duì)象(target):_UINavigationInteractiveTransition
  • 對(duì)象會(huì)調(diào)用的方法:handleNavigationTransition:
  • 此時(shí),就能實(shí)現(xiàn)邊緣右滑;
*當(dāng)我們重寫按鈕覆蓋系統(tǒng)按鈕時(shí):

    UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
    [btn setTitle:@"返回" forState:UIControlStateNormal];
    [btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    viewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:btn];

此時(shí)無論如何都不會(huì)有邊緣右滑功能.

2016-04-03 at 上午12.32.gif

*提出假設(shè):

1.0 是不是我們覆蓋navigation導(dǎo)航條按鈕后,其手勢(shì)被系統(tǒng)自動(dòng)釋放了呢?

    此時(shí)再打印該手勢(shì):
    NSLog(@"%@", self.interactivePopGestureRecognizer);

    輸出:和上面打印結(jié)果一樣,說明手勢(shì)沒有被釋放.

2.0 既然手勢(shì)沒有被釋放,那么系統(tǒng)是不是做了什么事?

這時(shí)候我們有發(fā)現(xiàn)一個(gè)現(xiàn)象:
* 該手勢(shì)是添加給整個(gè)導(dǎo)航控制器的
* 在根控制器下,該手勢(shì)無效
* 只有在非根控制器下,手勢(shì)才有效

系統(tǒng)必定監(jiān)聽了手勢(shì)在什么控制器下才能正常工作,猜測(cè)一下是不是代理(代理不就是整天框個(gè)大眼睛觀察對(duì)象嘛!)

    // 嘗試下,是否能夠打印該手勢(shì)的代理
    NSLog(@"%@", self.interactivePopGestureRecognizer.delegate);

    // 輸出結(jié)果如下;
    <_UINavigationInteractiveTransition: 0x7f9858e96120>

    // 在不覆蓋系統(tǒng)按鈕的情況下,此時(shí)嘗試
    self.interactivePopGestureRecognizer.delegate = nil;

測(cè)試結(jié)果如下:

2016-04-03 at 上午12.50.gif
發(fā)現(xiàn)再在根控制器下觸發(fā)該手勢(shì)后,然后點(diǎn)擊跳到下一界面時(shí),程序假死.....ing;

結(jié)論:系統(tǒng)手勢(shì)有代理,且代理實(shí)現(xiàn)在根控制器下手勢(shì)無效(畢竟已經(jīng)是根控制器了,還想往右滑???)

3.0 是不是現(xiàn)在已經(jīng)在懷疑:當(dāng)覆蓋系統(tǒng)按鈕時(shí),代理對(duì)我們做了什么...

    測(cè)試: 覆蓋按鈕,且把代理清空
    // navigation viewDidload方法中
    UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];

    viewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:btn];

    self.interactivePopGestureRecognizer.delegate = nil;

發(fā)現(xiàn)已經(jīng)可以實(shí)現(xiàn)屏幕邊緣右滑了,但是在根控制器下觸發(fā)左滑,由于設(shè)置代理為nil,會(huì)出現(xiàn)上述假死.

2016-04-03 at 上午12.58.gif

但我們可以這么解決
1.0 在根控制器下,把代理再設(shè)置回原來 (不常用)
2.0 自己設(shè)置代理,實(shí)現(xiàn)監(jiān)聽

 // 實(shí)現(xiàn)方法2
 // 1.手動(dòng)設(shè)置代理
 self.interactivePopGestureRecognizer.delegate = self;

 // 2.監(jiān)聽方法
 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {

 if (self.childViewControllers.count == 1) {
 // 根控制器下,不允許接受手勢(shì)
     return NO;
 }
 return YES;
}

到此已經(jīng)解決:自定義按鈕下,實(shí)現(xiàn)屏幕邊緣右滑功能.

*怎么實(shí)現(xiàn)全屏右滑?

  • 既然蘋果已經(jīng)提供好右滑功能,為什么我們不在蘋果的基礎(chǔ)上再進(jìn)一步呢?
  • 分析:蘋果手勢(shì)是邊緣(edge)型觸發(fā),那么我們實(shí)現(xiàn)全屏手勢(shì)即可

代碼實(shí)現(xiàn):

    // 全屏右滑,自己添加手勢(shì),采用系統(tǒng)的代理,以及調(diào)用系統(tǒng)的方法;李代桃僵
    // 1.0 創(chuàng)建手勢(shì)
    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self.interactivePopGestureRecognizer.delegate action:@selector(handleNavigationTransition:)];

    // 2.0 設(shè)置代理,處理根控制器下的業(yè)務(wù)
    pan.delegate = self;

    // 3.0 添加手勢(shì)到導(dǎo)航控制器的view
    [self.view addGestureRecognizer:pan];

    // 4.0 清空原生手勢(shì),以此避免不必要bug
   self.interactivePopGestureRecognizer.enabled = NO;

    // 實(shí)現(xiàn)代理方法
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    // 根控制器下,手勢(shì)無效
    return self.childViewControllers.count >1;
}

    // 解析:
    有沒有發(fā)現(xiàn)前面打印手勢(shì)時(shí):
    target=<_UINavigationInteractiveTransition 0x7f9858e96120>)>>

    打印手勢(shì)代理時(shí):
    輸出:<_UINavigationInteractiveTransition: 0x7f9858e96120>

    這兩貨是同一個(gè)對(duì)象....

    那么在我們自定義手勢(shì)中,讓蘋果提供的對(duì)象,調(diào)用它提供的方法就好了:
    initWithTarget:self.interactivePopGestureRecognizer.delegate action:@selector(handleNavigationTransition:)

全屏右滑效果圖:

2016-04-03 at 上午1.43.gif

由于截圖工具太爛,以及手速不行,截的圖都好丑....

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市匿刮,隨后出現(xiàn)的幾起案子垄琐,更是在濱河造成了極大的恐慌因篇,老刑警劉巖敌呈,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诬辈,死亡現(xiàn)場(chǎng)離奇詭異拳昌,居然都是意外死亡雨饺,警方通過查閱死者的電腦和手機(jī)钳垮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來额港,“玉大人饺窿,你說我怎么就攤上這事∫普叮” “怎么了肚医?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長向瓷。 經(jīng)常有香客問我肠套,道長,這世上最難降的妖魔是什么猖任? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任你稚,我火速辦了婚禮,結(jié)果婚禮上超升,老公的妹妹穿的比我還像新娘入宦。我一直安慰自己,他們只是感情好室琢,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布乾闰。 她就那樣靜靜地躺著,像睡著了一般盈滴。 火紅的嫁衣襯著肌膚如雪涯肩。 梳的紋絲不亂的頭發(fā)上轿钠,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音病苗,去河邊找鬼疗垛。 笑死,一個(gè)胖子當(dāng)著我的面吹牛硫朦,可吹牛的內(nèi)容都是我干的贷腕。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼咬展,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼泽裳!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起破婆,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤涮总,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后祷舀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瀑梗,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年裳扯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了抛丽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嚎朽,死狀恐怖铺纽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情哟忍,我是刑警寧澤狡门,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站锅很,受9級(jí)特大地震影響其馏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜爆安,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一叛复、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧扔仓,春花似錦褐奥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至版保,卻和暖如春呜笑,著一層夾襖步出監(jiān)牢的瞬間夫否,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來泰國打工叫胁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留凰慈,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓驼鹅,卻偏偏與公主長得像微谓,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子谤民,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫堰酿、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,024評(píng)論 4 62
  • /**/ reduce parameter xs: <#xs description#> returns: <#r...
    玉松閱讀 243評(píng)論 0 0
  • 我有一個(gè)朋友, 學(xué)校里很多女孩子都喜歡他, 可是卻沒見過他對(duì)誰曖昧過 我們每次打球的時(shí)候 都會(huì)有暗戀他的小女生在旁...
    林孤獨(dú)閱讀 375評(píng)論 0 1
  • 人間百態(tài)坎藐,各有所愛为牍,如是相遇,隨緣而在岩馍。 原創(chuàng)作品 (Original Article)
    一詩一境界閱讀 123評(píng)論 0 0
  • 涼城漠河閱讀 288評(píng)論 0 1