UINavigationController返回手势失效问题
2015-07-14 17:48
267 查看
转载:http://blog.csdn.net/cuibo1123/article/details/46841607
从iOS7开始,系统为UINavigationController提供了一个interactivePopGestureRecognizer用于右滑返回(pop),但是,如果自定了back button或者隐藏了navigationBar,该手势就失效了。
这是为什么呢?
interactivePopGestureRecognizer还存在,但没有起作用,可能是delegate里被阻断了没调用target/action,或者是调用了target/action没运行动画。
经过尝试(参考别人博客),发现自定义返回按钮或者隐藏navigationBar导致的该手势未起作用是因为在delegate阶段被阻断了。
如果我们知道action的名字,则可以添加一个自定义的滑动手势,直接调用该系统action。但API文档并没有提供。
结果就是要么自己实现滑动返回的动画action,要么自己重写interactivePopGestureRecognizer的delegate以让手势继续下去,触发系统的动画action。
新建一个类
让手势生效
在需要滑动返回的地方的
完成!
然后考虑到在push动画发生的时候,禁止滑动手势,在
在使用navigationController的viewcontroller里添加
该工程用了category+JRSwizzle交换了上面涉及到的UINavigationController的那些方法,还额外考虑了只自定义back button而不隐藏navigationBar的情况。无需一行代码,让系统的右滑返回动画重新回来!
原文地址:http://chisj.github.io/blog/2015/05/27/uinavigationcontrollerfan-hui-shou-shi-shi-xiao-wen-ti/
从iOS7开始,系统为UINavigationController提供了一个interactivePopGestureRecognizer用于右滑返回(pop),但是,如果自定了back button或者隐藏了navigationBar,该手势就失效了。
这是为什么呢?
原因
我们知道,interactivePopGestureRecognizer从手势触发到行为发生,要经过下面的阶段:interactivePopGestureRecognizer还存在,但没有起作用,可能是delegate里被阻断了没调用target/action,或者是调用了target/action没运行动画。
经过尝试(参考别人博客),发现自定义返回按钮或者隐藏navigationBar导致的该手势未起作用是因为在delegate阶段被阻断了。
如果我们知道action的名字,则可以添加一个自定义的滑动手势,直接调用该系统action。但API文档并没有提供。
结果就是要么自己实现滑动返回的动画action,要么自己重写interactivePopGestureRecognizer的delegate以让手势继续下去,触发系统的动画action。
实现方法
那就把delegate自己实现一下吧。新建一个类
BaseNavigationController,实现delegate:
<span class="line-number" style="font-family:inherit;color:#586e75;margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">1</span> <span class="line-number" style="font-family:inherit;color:#586e75;margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">2</span> <span class="line-number" style="font-family:inherit;color:#586e75;margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">3</span> <span class="line-number" style="font-family:inherit;color:#586e75;margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">4</span> | - (void)viewDidLoad { [super viewDidLoad]; self.interactivePopGestureRecognizer.delegate = self; } |
<span class="line-number" style="font-family:inherit;color:#586e75;margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">1</span> <span class="line-number" style="font-family:inherit;color:#586e75;margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">2</span> <span class="line-number" style="font-family:inherit;color:#586e75;margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">3</span> <span class="line-number" style="font-family:inherit;color:#586e75;margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">4</span><span class="line-number" style="font-family:inherit;color:#586e75;margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">5</span> | - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer { if (self.viewControllers.count <= 1 ) { return NO; } return YES; } |
UINavigationController换成
BaseNavigationController。
完成!
然后考虑到在push动画发生的时候,禁止滑动手势,在
BaseNavigationController添加
<span class="line-number" style="font-family:inherit;color:#586e75;margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">1</span> <span class="line-number" style="font-family:inherit;color:#586e75;margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">2</span> <span class="line-number" style="font-family:inherit;color:#586e75;margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">3</span> <span class="line-number" style="font-family:inherit;color:#586e75;margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">4</span> | - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated { [super pushViewController:viewController animated:animated]; self.interactivePopGestureRecognizer.enabled = NO; } |
<span class="line-number" style="font-family:inherit;color:#586e75;margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">1</span> <span class="line-number" style="font-family:inherit;color:#586e75;margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">2</span> <span class="line-number" style="font-family:inherit;color:#586e75;margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">3</span> <span class="line-number" style="font-family:inherit;color:#586e75;margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">4</span> | - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; self.navigationController.interactivePopGestureRecognizer.enabled = YES; } |
结果
当然不需要把上面的代码都抄一遍,因为这么通用的功能由一位韩国开发者做成组件,放在了github https://github.com/devxoul/SwipeBack。你只需要<span class="line-number" style="font-family:inherit;color:#586e75;margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">1</span> <span class="line-number" style="font-family:inherit;color:#586e75;margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">2</span> | platform :ios, '7.0' pod 'SwipeBack', '~> 1.0' |
原文地址:http://chisj.github.io/blog/2015/05/27/uinavigationcontrollerfan-hui-shou-shi-shi-xiao-wen-ti/
相关文章推荐
- How to disable vertical scrolling in UIScrollView (Obj-C)
- 黑马程序员_JAVA之GUI与Socket
- 数码测色计获取UIColor的RGB
- UIViewController 的表现方式
- 手机开机画面制作工具(LogoBuilder)
- 手机开机画面制作工具(LogoBuilder)
- sqlServer 生成UUID方法
- 颜色转换:#hhhfff->UIColor (MHHexColoring)
- MySQL查询报错 ERROR: No query specified
- Druid validationQuery 错误
- BFKit:对常用 UIButton,UIColor,UIDevice,UIFont ,UIImage 等开发类进行了扩展
- JAVA关于Stirng,StringBuilder,StringBuffer的比较
- Android 解决attempt to acquire a reference on a close SQLiteClosable
- Android 解决Android requires compiler compliance level 5.0 or 6.0. Found '1.7'
- UI4_UITableViewSectionIndex
- UI3_UITableViewDelete(多选)
- UI2_UITableViewDelete
- Leetcode_95 Unique Binary Search Trees II
- What's the difference between all the Selection Segues?
- iOS UITableView Cell动态高度(使用AutoLayout)