iOS7上leftBarButtonItem无法实现滑动返回的完美解决方案
来源:互联网 发布:淘宝方正字体排查软件 编辑:程序博客网 时间:2024/05/31 19:26
今天遇到了在iOS7上使用leftBarButtonItem却无法响应滑动返回事件的问题,一番谷歌,最后终于解决了,在这里把解决方案分享给大家。
在iOS7之前的系统,如果要自定义返回按钮,直接设置backBarButtonItem是不行的,有两种方式,一种是用leftBarButtonItem替代;一种是:
- UIImage *backButtonImage = [[UIImage imageNamed:@"Graphics/Shared/navigation_back_button.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];
- [[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
- [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, backButtonImage.size.height*2) forBarMetrics:UIBarMetricsDefault];
但第二种方法只能自定义返回按钮的背景和文字,如果要自定义上面的图标则不行。所以使用leftBarButtonItem是最佳方式。
但是在iOS7系统中,自带了可以通过右滑返回上一级页面的手势,如果仅仅修改leftBarButtonItem是无法响应这个手势的。可以在pushViewController之后加入如下代码:
- [_currentNav pushViewController:viewController animated:YES];
- //开启iOS7的滑动返回效果
- if ([_currentNav respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
- _currentNav.interactivePopGestureRecognizer.delegate = nil;
- }
这样即可完美解决iOS7上无法滑动的问题。
当然网上还有一种解决方法是在设置leftBarButtonItem之后加上:
- self.navigationItem.backBarButtonItem = backButton;
- self.navigationController.interactivePopGestureRecognizer.delegate = self;
但这两行代码必须放在viewWillAppear中,相比上一种方式要修改的代码更多,因此建议使用上一种方式。
响应了iOS7的滑动返回手势之后,我们还会发现一个问题,iOS7的滑动返回不会调用我们给leftBarButtonItem设置的回调,那么返回的事件如何捕捉呢?可以通过以下代码:
- - (void)viewWillDisappear: (BOOL)animated
- {
- [super viewWillDisappear: animated];
- if (![[self.navigationController viewControllers] containsObject: self])
- {
- // the view has been removed from the navigation stack, back is probably the cause
- // this will be slow with a large stack however.
- }
- }
至此,我们就完美解决了iOS7上使用leftBarButtonItem的滑动返回问题。
有朋友提出以上方式在多次滑动之后会导致界面假死,这里再给出一种解决方案:
在所有除一级页面之外的页面的viewDidAppear和viewWillDisappear中加入以下代码:
- - (void)viewWillDisappear:(BOOL)animated {
- [super viewWillDisappear:animated];
- //代理置空,否则会闪退
- if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
- self.navigationController.interactivePopGestureRecognizer.delegate = nil;
- }
- }
- - (void)viewDidAppear:(BOOL)animated {
- [super viewDidAppear:animated];
- //开启iOS7的滑动返回效果
- if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
- //只有在二级页面生效
- if ([self.navigationController.viewControllers count] == 2) {
- self.navigationController.interactivePopGestureRecognizer.delegate = self;
- }
- }
- }
在uinavigationcontroller的delegate中实现以下方法:
- - (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
- //开启滑动手势
- if ([navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
- navigationController.interactivePopGestureRecognizer.enabled = YES;
- }
- }
在pushviewcontroller之前加入以下代码:
- //在切换界面的过程中禁止滑动手势,避免界面卡死
- if ([_currentNav respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
- _currentNav.interactivePopGestureRecognizer.enabled = NO;
- }
- [_currentNav pushViewController:viewController animated:YES];
即可在实现滑动返回的同时,避免界面卡死的问题。
如果大家觉得对自己有帮助的话,还希望能帮顶一下,谢谢:)
个人博客:http://blog.csdn.net/zhaoxy2850
本文地址:http://blog.csdn.net/zhaoxy_thu/article/details/15811189
转载请注明出处,谢谢!
1 0
- iOS7上leftBarButtonItem无法实现滑动返回的完美解决方案
- iOS7上leftBarButtonItem无法实现滑动返回的完美解决方案
- iOS7上leftBarButtonItem无法实现滑动返回的完美解决方案
- iOS7上leftBarButtonItem无法实现滑动返回的完美解决方案
- iOS7上leftBarButtonItem无法实现滑动返回的完美解决方案
- iOS7上leftBarButtonItem无法实现滑动返回的完美解决方案
- iOS7上leftBarButtonItem无法实现滑动返回的完美解决方案
- iOS7上leftBarButtonItem无法实现滑动返回的完美解决方案
- iOS7上leftBarButtonItem无法实现滑动返回的完美解决方案(转)
- iOS开发--iOS7以上自定义leftBarButtonItem后系统滑动返回失效的完美解决方案
- iOS iOS7以上设置leftBarButtonItem后滑动返回实效
- IOS7滑动返回的纠结
- iOS7.1企业应用"无法安装应用程序 因为证书无效"的完美解决方案
- iOS7.1企业应用"无法安装应用程序 因为证书无效"的完美解决方案
- iOS7 Navgation的手势滑动返回功能
- iOS7滑动返回
- iOS7滑动返回
- iOS7滑动返回
- 2013级C++第12周(春)项目——成员的访问属性、多重继承 【项目2 - 教师兼干部类】
- FetchMode的详细解释
- NOJ[1020] 聊天字数统计
- .NET中Page_Load事件
- TTL、CMOS和RS232电平的区别和联系
- iOS7上leftBarButtonItem无法实现滑动返回的完美解决方案
- Lucene 4.7 教程起步--高亮显示
- Battery Charging Specification, Revision 1.2, December 7, 2010 中文
- 修改MyEclipse的默认编码
- 使用 stvd 编译STM8S 时能看到使用RAM ROM大小的方法
- android webview https blank
- World Break leetcode
- 在Linux下 安装 License Manager 出现的问题
- 信号处理方法的问题