问题:iOS使用百度导航弹出导航页面时白色导航栏一闪而过,骚等一会儿导航栏就会自己消失,如图。
原因:项目中使用了全屏返回手势第三方
FDFullscreenPopGesture
,里面调用了[self fd_setupViewControllerBasedNavigationBarAppearanceIfNeeded:viewController];
方法对导航栏进行外观处理,解决方案:原谅我这个小菜鸡,虽然找到位置了,但是没有找到具体是哪行代码引起的,所以我就简单粗暴地注释了
//[self fd_setupViewControllerBasedNavigationBarAppearanceIfNeeded:viewController];
解决问题的思路
1.由于弹出导航页面的代码为:[BNCoreServices_UI showPage:BNaviUI_NormalNavi delegate:self extParams:nil];
,并没有通过present或者push方法弹出导航页面,我猜想:
猜想1: 导航页面是通过
[[[UIApplication sharedApplication]keyWindow]addSubview:导航页];
添加到keyWindow上。
验证:通过Xcode自带的Debug View Hierarchy分析项目层级结构、以及遍历keyWindow所有view并改变view的背景色,发现导航页面并不是添加到keyWindow上的。
猜想2: 导航页面是通过present方式弹出。
验证: 导航页面弹出方向为由下到上弹出。然后我建了个UIViewController的分类,通过runtime交换了presentViewController和naviPresentViewController的实现,在naviPresentViewController里面隐藏了导航栏,发现并没有什么卵用。
2.我写了个Demo,为了减少和项目的差别,我都是BaseTabBarController->BaseNavigationContrller->BaseViewController的结构,然后通过一个按钮弹出导航页面,发现并没有出现这个问题,那我就找Demo和项目有什么不一样的地方了:(1) Demo和项目页面不一样。但是我自己写的代码,不同的页面是不会引起相互作用的,这点我很清楚;(2)再就是项目中使用了一些三方库,很有可能就是某些三方库使用了某些方法修改了导航栏!
然后我就每次导入一个三方库,然后运行Demo进入导航,终于发现原来是全屏返回手势第三方FDFullscreenPopGesture引起的。我第一眼就看到了源码中有+ (void)load方法,方法里面交换了pushViewController和fd_pushViewController的实现,然后去fd_pushViewController方法里,把英文注释翻译成汉语,发现了一句
// Handle perferred navigation bar appearance.
//处理允许的导航栏外观。
[self fd_setupViewControllerBasedNavigationBarAppearanceIfNeeded:viewController];
然后我注释了这句代码,白色导航栏的bug没有再出现。
本来想改的完美一点的,无奈技术有限,只能通过注释掉[self fd_setupViewControllerBasedNavigationBarAppearanceIfNeeded:viewController];来解决,好尴尬😰
我只是一个在学习iOS的路上探索的小菜鸟,愿分享自己遇到的坑和解决思路与君共勉,如有不足之处,还请多多指教。
网友评论