【OC】UINavController常見(jiàn)問(wèn)題【轉(zhuǎn)】

一穷当、手勢(shì)右滑返回效果失效

在我們經(jīng)常使用的APP中,已經(jīng)習(xí)慣右滑返回這個(gè)效果,可是我發(fā)現(xiàn)我們的APP中這個(gè)功能失效了情萤,只能點(diǎn)擊左上角的返回按鈕才能執(zhí)行返回這個(gè)效果。后來(lái)查了一下發(fā)現(xiàn)摹恨,導(dǎo)致這個(gè)問(wèn)題的原因是因?yàn)槲覀冏约鹤远x了左上角的leftBarButtonItem筋岛,我們自定義了這個(gè)BarButtonItem使得系統(tǒng)不能捕獲pop手勢(shì)了。

解決方法:

創(chuàng)建一個(gè)UINavigationController的子類LGJBaseNavController晒哄,該類@interface LGJBaseNavController ()睁宰,所有的關(guān)于導(dǎo)航控制器的操作都在這個(gè)類里面操作。

1 設(shè)置手勢(shì)的delegate為self寝凌,導(dǎo)航控制器的delegate也為self柒傻。
- (void)viewDidLoad {
    [super viewDidLoad];
    __weak LGJBaseNavController *weakSelf = self;

    if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
  
    self.interactivePopGestureRecognizer.delegate = weakSelf;
    self.delegate = weakSelf;
    }
}
 
- (UIViewController *)popViewControllerAnimated:(BOOL)animated {
  
    return [super popViewControllerAnimated:animated];
}
2 在轉(zhuǎn)場(chǎng)/過(guò)渡的時(shí)候禁用 interactivePopGestureRecognizer當(dāng)用戶在轉(zhuǎn)場(chǎng)的時(shí)候觸發(fā)一個(gè)后退手勢(shì),這時(shí)候容易各種其他事件也會(huì)被喚醒较木,導(dǎo)航椇旆或邊混亂。那么在轉(zhuǎn)場(chǎng)效果的過(guò)程中禁用手勢(shì)識(shí)別,當(dāng)新的視圖控制器加載完成后再啟用。
#pragma mark - UINavigationControllerDelegate

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated {

    if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
       
       self.interactivePopGestureRecognizer.enabled = NO;
    }
    //設(shè)置返回按鈕
    if (self.viewControllers.count > 0) {
 
        viewController.navigationItem.leftBarButtonItem = [self backButtonItem];
    }
    [super pushViewController:viewController animated:animated];
}

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
    
    if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
         
        self.interactivePopGestureRecognizer.enabled = YES;
    }
}
3 使navigationcontroller中第一個(gè)控制器不響應(yīng)右滑pop手勢(shì)
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
 
    if ([self.childViewControllers count] == 1) {
         
        return NO;
    }
    return YES;
}
4 解決多個(gè)手勢(shì)沖突 同時(shí)接受多個(gè)手勢(shì)
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {

    return YES;
}
5 解決在手指滑動(dòng)時(shí)候,被pop的viewController中的UIscrollView會(huì)跟著一起滾動(dòng)
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    
    return [gestureRecognizer isKindOfClass:UIScreenEdgePanGestureRecognizer.class];
}

關(guān)于這個(gè)處理復(fù)雜手勢(shì)沖突的方法有幾個(gè)類似的手勢(shì)代理方法:

//手指觸摸屏幕后回調(diào)的方法预侯,返回NO則不再進(jìn)行手勢(shì)識(shí)別致开,方法觸發(fā)等

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch;

//開(kāi)始進(jìn)行手勢(shì)識(shí)別時(shí)調(diào)用的方法,返回NO則結(jié)束雌桑,不再觸發(fā)手勢(shì)

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer;

//是否支持多時(shí)候觸發(fā)喇喉,返回YES,則可以多個(gè)手勢(shì)一起觸發(fā)方法校坑,返回NO則為互斥

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;

//下面這個(gè)兩個(gè)方法也是用來(lái)控制手勢(shì)的互斥執(zhí)行的

//這個(gè)方法返回YES拣技,第一個(gè)手勢(shì)和第二個(gè)互斥時(shí),第一個(gè)會(huì)失效

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRequireFailureOfGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer NS_AVAILABLE_IOS(7_0);

//這個(gè)方法返回YES耍目,第一個(gè)和第二個(gè)互斥時(shí)膏斤,第二個(gè)會(huì)失效

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer NS_AVAILABLE_IOS(7_0);

可以將這幾個(gè)方法寫(xiě)在一個(gè)UINavigationController的子類里面,然后在AppDelegate中設(shè)置self.window.rootViewController = [[LGJBaseNavController alloc] initWithRootViewController:vc1];可以處理全局的導(dǎo)航控制器關(guān)于這個(gè)右滑手勢(shì)返回失效的問(wèn)題邪驮,我以上寫(xiě)的這些方法直接寫(xiě)在里面就可以莫辨。另外說(shuō)一句,在這個(gè)LGJBaseNavController中可以設(shè)置導(dǎo)航欄的一些自定義樣式:比如這種樣式就可以在LGJBaseNavController初始化中設(shè)置:


1496369431733830.png

navBar.png

+ (void)initialize {

    //bar樣式
    UINavigationBar *bar = [UINavigationBar appearance];
    [bar setBarStyle:UIBarStyleDefault];
    [bar setBarTintColor:[UIColor blackColor]];
    [bar setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIColor whiteColor],NSForegroundColorAttributeName, nil]];

    //barButton樣式    
    UIBarButtonItem *item = [UIBarButtonItem appearance];
     
    //Normal   
    NSMutableDictionary *textAtts = [NSMutableDictionary dictionary];
    textAtts[NSForegroundColorAttributeName] = [UIColor orangeColor];
    textAtts[NSFontAttributeName] = [UIFont systemFontOfSize:13];

    [item setTitleTextAttributes:textAtts forState:UIControlStateNormal];
        
    //不可用狀態(tài)    
    NSMutableDictionary *disableTextAtts = [NSMutableDictionary dictionary];

    disableTextAtts[NSForegroundColorAttributeName] = [UIColor colorWithRed:123/255.0 green:123/255.0 blue:123/255.0 alpha:1];
        
    disableTextAtts[NSFontAttributeName] = [UIFont systemFontOfSize:13];
    [item setTitleTextAttributes:disableTextAtts forState:UIControlStateDisabled];
}
二毅访、隱藏NavigationBar返回時(shí)沮榜,上面會(huì)有空缺

這個(gè)應(yīng)該也是我們經(jīng)常見(jiàn)的效果,比如vc1跳轉(zhuǎn)vc2喻粹,vc2的導(dǎo)航欄是隱藏的蟆融,當(dāng)從vc2返回vc1時(shí),在這個(gè)過(guò)程中守呜,放慢看上面會(huì)有缺失一塊型酥,放快了看就是閃屏,這個(gè)效果對(duì)用戶也是不友好的查乒,這個(gè)解決方法比較簡(jiǎn)單弥喉。就是在次級(jí)viewControleller中在設(shè)置setNavigationBarHidden時(shí)這樣設(shè)置: <重要的是后面的animated參數(shù)>

- (void)viewWillAppear:(BOOL)animated {

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

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

注:此文章為轉(zhuǎn)載,原文地址:http://www.cocoachina.com/ios/20170602/19418.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末玛迄,一起剝皮案震驚了整個(gè)濱河市由境,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蓖议,老刑警劉巖藻肄,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異拒担,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)攻询,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)从撼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事低零∑畔瑁” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵掏婶,是天一觀的道長(zhǎng)啃奴。 經(jīng)常有香客問(wèn)我,道長(zhǎng)雄妥,這世上最難降的妖魔是什么最蕾? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮老厌,結(jié)果婚禮上瘟则,老公的妹妹穿的比我還像新娘。我一直安慰自己枝秤,他們只是感情好醋拧,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著淀弹,像睡著了一般丹壕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上薇溃,一...
    開(kāi)封第一講書(shū)人閱讀 51,562評(píng)論 1 305
  • 那天菌赖,我揣著相機(jī)與錄音,去河邊找鬼痊焊。 笑死盏袄,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的薄啥。 我是一名探鬼主播辕羽,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼垄惧!你這毒婦竟也來(lái)了刁愿?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤到逊,失蹤者是張志新(化名)和其女友劉穎铣口,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體觉壶,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡脑题,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了铜靶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叔遂。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出已艰,到底是詐尸還是另有隱情痊末,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布哩掺,位于F島的核電站凿叠,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏嚼吞。R本人自食惡果不足惜盒件,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望誊薄。 院中可真熱鬧履恩,春花似錦、人聲如沸呢蔫。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)片吊。三九已至绽昏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間俏脊,已是汗流浹背全谤。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留爷贫,地道東北人认然。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像漫萄,于是被迫代替她去往敵國(guó)和親卷员。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

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