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)畫中的樣子。
異常效果:

正常效果:

解決方法用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的效果圖:

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

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/