iOS側(cè)滑返回實(shí)現(xiàn)

1. 使用官方API解決Navigation側(cè)滑導(dǎo)致的Navigationbar異常顯示和隱藏的問題

參考:http://blog.csdn.net/u012399891/article/details/50502035

問題一

登陸頁面隱藏了navigationbar,注冊(cè)和關(guān)于頁面顯示了navigationbar,在側(cè)滑時(shí)如果從注冊(cè)頁面?zhèn)然话耄ú灰砷_手)讓登陸頁面顯示然后再往左滑把登陸頁面收起,此時(shí)點(diǎn)擊關(guān)于頁時(shí)頭上的navigationbar就成了注冊(cè)頁的navigationbar。效果如下(附帶正常效果):

問題二(原來的一個(gè)項(xiàng)目的效果就是問題二)

注冊(cè)頁側(cè)滑回登陸頁的過程中,注冊(cè)頁的navigationbar被隱藏了,而我們想要的效果是正常效果動(dòng)畫中的樣子。

異常效果:


異常效果.gif

正常效果:


正常效果.gif

解決方法用forKingdog的開源框架中的一個(gè)分類就可以解決了:名稱是UINavigationController+FDFullscreenPopGesture
(一個(gè)很不錯(cuò)的開源項(xiàng)目附地址:https://github.com/forkingdog)這個(gè)分類,然后在需要隱藏navigation bar的頁面設(shè)置屬性 self.fd_prefersNavigationBarHidden = YES;問題即可解決!

分類的分析:

現(xiàn)在給大家分享下成果,源碼不多,一個(gè).m文件也就200多行,代碼,沒有寫特意寫專場(chǎng)動(dòng)畫,使用系統(tǒng)的interactivePopGestureRecognizer.delegate也就是系統(tǒng)的轉(zhuǎn)場(chǎng)動(dòng)畫來實(shí)現(xiàn)效果。那么說,系統(tǒng)就應(yīng)該為我們實(shí)現(xiàn)好了我們想要的效果才對(duì),于是乎繼續(xù)查看搜索fd_prefersNavigationBarHidden到底是在什么地方調(diào)用,為何用了它切換時(shí)的動(dòng)畫效果就解決了。于是在下面的代碼中找到了答案

- (void)fd_setupViewControllerBasedNavigationBarAppearanceIfNeeded:(UIViewController *)appearingViewController
{
    if (!self.fd_viewControllerBasedNavigationBarAppearanceEnabled) {
        return;
    }
    __weak typeof(self) weakSelf = self;
    _FDViewControllerWillAppearInjectBlock block = ^(UIViewController *viewController, BOOL animated) {
        __strong typeof(weakSelf) strongSelf = weakSelf;
        if (strongSelf) {
            [strongSelf setNavigationBarHidden:viewController.fd_prefersNavigationBarHidden animated:animated];
        }
    };

    appearingViewController.fd_willAppearInjectBlock = block;
    UIViewController *disappearingViewController = self.viewControllers.lastObject;
    if (disappearingViewController && !disappearingViewController.fd_willAppearInjectBlock) {
        disappearingViewController.fd_willAppearInjectBlock = block;
    }
}

重點(diǎn):

[strongSelf setNavigationBarHidden:viewController.fd_prefersNavigationBarHiddenanimated:animated];

就是解決問題的關(guān)鍵,我們之前一直使用

self.navigationController.navigationBarHidden
或者self.navigationController.navigationBar.hidden來隱藏navigatiuonbar,
這樣直接更改屬性的方式是不帶動(dòng)畫的,

而且滑動(dòng)時(shí)的轉(zhuǎn)場(chǎng)動(dòng)畫頁不為我們處理好,才導(dǎo)致了問出的出現(xiàn).

文章重點(diǎn):

- (void)setNavigationBarHidden:(BOOL)hidden animated:(BOOL)animated;

為我們完美的解決這樣的問題,作者不用UINavigationController+FDFullscreenPopGesture,而是使用系統(tǒng)默認(rèn)的API來嘗試解決:

給自定義navigation添加側(cè)滑轉(zhuǎn)場(chǎng)動(dòng)畫:

#import "MyNavigationController.h"
@interface MyNavigationController()<UIGestureRecognizerDelegate>

@end

@implementation MyNavigationController

- (void)viewDidLoad {
    [super viewDidLoad];

        // 獲取系統(tǒng)自帶滑動(dòng)手勢(shì)的target對(duì)象
        id target = self.interactivePopGestureRecognizer.delegate;

        // 創(chuàng)建全屏滑動(dòng)手勢(shì),調(diào)用系統(tǒng)自帶滑動(dòng)手勢(shì)的target的action方法
        UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:target action:@selector(handleNavigationTransition:)];

        // 設(shè)置手勢(shì)代理,攔截手勢(shì)觸發(fā)
        pan.delegate = self;

        // 給導(dǎo)航控制器的view添加全屏滑動(dòng)手勢(shì)
        [self.view addGestureRecognizer:pan];

        // 禁止使用系統(tǒng)自帶的滑動(dòng)手勢(shì)
        self.interactivePopGestureRecognizer.enabled = NO;
}

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
    // 注意:只有非根控制器才有滑動(dòng)返回功能,根控制器沒有。
    // 判斷導(dǎo)航控制器是否只有一個(gè)子控制器,如果只有一個(gè)子控制器,肯定是根控制器
    if (self.childViewControllers.count == 1) {
        // 表示用戶在根控制器界面,就不需要觸發(fā)滑動(dòng)手勢(shì),
        return NO;
    }
    return YES;
}

@end

然后再創(chuàng)建3個(gè)ViewController來相互切換,第一個(gè)是隱藏navigationbar的,后面2個(gè)不隱藏
隱藏navigationbar的ViewController代碼如下:

-(void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];

    [self.navigationController setNavigationBarHidden:YES animated:YES];
}

不隱藏navigationbar的ViewController代碼如下:

-(void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    [self.navigationController setNavigationBarHidden:NO animated:YES];
}

附上使用- (void)setNavigationBarHidden:(BOOL)hidden animated:(BOOL)animated的效果圖:

動(dòng)畫.gif

附上使用navigationController.navigationBar.hidden的效果對(duì)比:

非動(dòng)畫.gif

demo項(xiàng)目地址:https://github.com/CharmingLee/FullscreenPopGesture.Git

這個(gè)demo有缺點(diǎn):
從右邊忘左邊劃動(dòng)也能觸發(fā)側(cè)滑操作,有手勢(shì)沖突,并不完美。且調(diào)用官方私有API

另外:正是缺點(diǎn)的所在,和Cell的側(cè)滑刪除手勢(shì)也是有沖突的,也就是說,免不了需要解決手勢(shì)的沖突。

適用需求:最好不用,畢竟缺點(diǎn)明顯

2.關(guān)于UINavigationController+FDFullscreenPopGesture請(qǐng)參考

這個(gè)三方實(shí)現(xiàn)(集成最簡(jiǎn)單、功能最全面):
參考://blog.sunnyxx.com/2015/06/07/fullscreen-pop-gesture/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,271評(píng)論 4 61
  • 一直在想,自己能不能寫一些像樣的東西?但是真正拿起手機(jī),才發(fā)現(xiàn)自己腦袋里實(shí)在空,根本寫不出什么。 If I wan...
    兩個(gè)逗兒閱讀 182評(píng)論 0 0
  • 【八六子(仲春夜雨驟)】 鐘瑞意 霧蒙蒙,昨宵窗外,長(zhǎng)聞?dòng)晡璐猴L(fēng)。一夜婆娑漸曉,眺望云壓蒼穹,遠(yuǎn)山黛峰。 ...
    粵東文苑閱讀 568評(píng)論 2 0
  • 今天遇到的問題是DrawerLayout在上面,下面的View拿不到點(diǎn)擊事件,最后實(shí)在沒辦法,都曲線救國了(只要解...
    BertSir閱讀 1,074評(píng)論 0 0

友情鏈接更多精彩內(nèi)容