使用官方API解决Navigation侧滑导致的Navigationbar异常显示和隐藏的问题
来源:互联网 发布:icloud储存空间已满mac 编辑:程序博客网 时间:2024/04/29 18:47
经历了一个多月终于基本完成公司一个项目的重构,在这后面的几天调试中发现了一些小问题,小编讲写成博客记录下来,当做是自己技术生涯的记录,同时也希望能帮助一些刚入IOS的朋友们。
昨天调试navigationbar的时候发现了一些奇怪的问题,和预期效果差距有点远。
问题一、登陆页面隐藏了navigationbar,注册和关于页面显示了navigationbar,在侧滑时如果从注册页面侧滑一半(不要松开手)让登陆页面显示然后再往左滑把登陆页面收起,此时点击关于页时头上的navigationbar就成了注册页的navigationbar。效果如下(附带正常效果):
问题二、注册页侧滑回登陆页的过程中,注册页的navigationbar被隐藏了,而我们想要的效果是正常效果动画中的样子。
异常效果:
正常效果:
当时问了团队里一个老手,解决方案是在项目中添加UINavigationController+FDFullscreenPopGesture(一个很不错的开源项目附地址:https://github.com/forkingdog)这个分类,然后在需要隐藏navigation bar的页面设置属性 self.fd_prefersNavigationBarHidden = YES;问题即可解决!
可是小编这种好奇心强的怎么甘于就这样解决问题?这个分类是如何解决的问题?一大堆问好在小编的脑力飘过,于是画了一个多小时研究人家的分类是如何实现的。
现在给大家分享下成果,源码不多,一个.m文件也就200多行,代码,没有写特意写专场动画,和之前小编做的demo一样的使用系统的interactivePopGestureRecognizer.delegate也就是系统的转场动画来实现效果。那么说,系统就应该为我们实现好了我们想要的效果才对,于是乎继续查看搜索fd_prefersNavigationBarHidden到底是在什么地方调用,为何用了它切换时的动画效果就解决了。于是在下面的代码中找到了答案
- (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]; } }; // Setup will appear inject block to appearing view controller. // Setup disappearing view controller as well, because not every view controller is added into // stack by pushing, maybe by "-setViewControllers:". appearingViewController.fd_willAppearInjectBlock = block; UIViewController *disappearingViewController = self.viewControllers.lastObject; if (disappearingViewController && !disappearingViewController.fd_willAppearInjectBlock) { disappearingViewController.fd_willAppearInjectBlock = block; }}
其中[strongSelfsetNavigationBarHidden:viewController.fd_prefersNavigationBarHiddenanimated:animated];就是解决问题的关键,我们之前一直使用self.navigationController.navigationBarHidden或者self.navigationController.navigationBar.hidden来隐藏navigatiuonbar,这样直接更改属性的方式是不带动画的,而且滑动时的转场动画页不为我们处理好,才导致了问出的出现,而- (void)setNavigationBarHidden:(BOOL)hidden animated:(BOOL)animated;为我们完美的解决这样的问题,于是乎小编赶紧创新新工程不用UINavigationController+FDFullscreenPopGesture,使用系统默认的API来尝试解决:
给自定义navigation添加侧滑转场动画:
#import "MyNavigationController.h"@interface MyNavigationController()<UIGestureRecognizerDelegate>@end@implementation MyNavigationController- (void)viewDidLoad { [super viewDidLoad]; // 获取系统自带滑动手势的target对象 id target = self.interactivePopGestureRecognizer.delegate; // 创建全屏滑动手势,调用系统自带滑动手势的target的action方法 UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:target action:@selector(handleNavigationTransition:)]; // 设置手势代理,拦截手势触发 pan.delegate = self; // 给导航控制器的view添加全屏滑动手势 [self.view addGestureRecognizer:pan]; // 禁止使用系统自带的滑动手势 self.interactivePopGestureRecognizer.enabled = NO;}- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{ // 注意:只有非根控制器才有滑动返回功能,根控制器没有。 // 判断导航控制器是否只有一个子控制器,如果只有一个子控制器,肯定是根控制器 if (self.childViewControllers.count == 1) { // 表示用户在根控制器界面,就不需要触发滑动手势, return NO; } return YES;}@end
然后再创建3个ViewController来相互切换,第一个是隐藏navigationbar的,后面2个不隐藏
隐藏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的效果对比:
demo项目地址:https://github.com/CharmingLee/FullscreenPopGesture.git
- 使用官方API解决Navigation侧滑导致的Navigationbar异常显示和隐藏的问题
- NavigationBar 隐藏和显示带来的问题和解决办法
- NavigationBar的隐藏与显示
- 解决隐藏NavigationBar后跳转界面闪现小黑块的问题
- 关于navigationController,前后2个视图控制器navigationBar隐藏属性不同,导致右滑手势失效问题的解决办法
- 解决ios7中navigationbar位置显示不固定的问题
- 解决UISearchDisplayController 在消失后显示navigationController.navigationBar的问题
- 关于navigationBar隐藏导致pop时出现黑条或其他颜色条的问题
- 隐藏tabbarviewcontroller的navigationbar和其moreNavigationController的navigationbar
- 解决使用BadgeView导致视图显示错误的问题
- 解决easyui动态隐藏或显示列导致列表排版错乱的问题
- 隐藏navigationBar之后滑动返回的问题
- NavigationBar的隐藏方法
- 解决RecyclerView复用导致EdittText、CheckBox等显示异常的问题
- 官方推荐react-navigation的使用
- 官方推荐react-navigation的使用
- 官方推荐react-navigation的使用
- NavigationBar 隐藏,显示控制(完美解决)
- iOS状态栏获取网络类型,运营商,电池电量,显示的系统时间等信息
- Java 加密解密之对称加密算法AES
- Android开发组件
- Integer值比较的问题
- MP4解析
- 使用官方API解决Navigation侧滑导致的Navigationbar异常显示和隐藏的问题
- 俯卧撑项目
- FusionCharts在PHP开发中的使用
- 小议人生
- android代码混淆和打包签名
- 程序运行的具体步骤总结
- eclipse下如何打开ftl文件
- nyoj--16--矩形嵌套(动态规划)
- 用window.open实现全屏显示窗口