-
侧滑返回
- NavigationController自从iOS7.0之后, 增加了一个滑动返回功能, 当push入一个控制器并且展示了这个控制器的View时, 除了点击左上方的返回按钮之外, 还可以向右滑动屏幕左边缘同样可以达到返回上一级界面的效果
- 但是侧滑返回的问题就在于, 我们在项目中, 经常要使用自定义的返回按钮. 而当你使用了自定义按钮时, 你会发现侧滑返回效果挂掉了
-
侧滑返回的原理分析
-
手势:
侧滑返回, 需要手指侧滑屏幕, 因此从这一点可以推断出来, 侧滑返回功能应该是一个UIGestureRecognizer
-
进入UINavigationController的头文件中, 搜索UIGestureRecognizer, 这时我们会发现一个属性, 他就是用来管理导航控制器侧滑返回功能的手势
// 这就是侧滑返回手势 @property(nullable, nonatomic, readonly) UIGestureRecognizer *interactivePopGestureRecognizer NS_AVAILABLE_IOS(7_0)
通过查看文档, 可以了解到, 这个手势专门用来执行pop功能, 将栈顶控制器移除, 同时你还可以给当前这个View增加别的手势并且和侧滑返回手势绑定在一起(但是尽量不要这么用, 不觉得很反人类么...)
-
代理:
-
这个手势是readonly, 也就是说你不能去修改他, 但是他在自定义按钮的时候确确实实的失效了. 而导致这个的真正原因, 可以让人联想到UIGestureRecognizerDelegate代理中的代理方法
// 这个方法返回的BOOL值, 决定这个手势是否能够生效 - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer;
从这一点基本上就可以断定, 侧滑返回的代理, 检测到你自定义了返回按钮, 因此拦截了侧滑返回手势
而我们要做的就是不让代理拦截他
-
-
-
恢复侧滑返回手势
-
首先, 我们要在自定义的NavigationController中, 当ViewDidLoad方法调用了, 为侧滑返回手势设置代理, 注意当前类要遵守
<UIGestureRecognizerDelegate>
协议self.interactivePopGestureRecognizer.delegate = self;
-
手动实现代理方法, 让手势可以使用
- 在这里一定要注意: 如果你不判断当前子控制器的数量的话, 直接返回YES, 那么你的根控制器也会响应侧滑返回手势
- 如果根控制器使用侧滑返回的话, 你的UI界面就会变为假死状态, 这是一个很严重的Bug, 因此一定要注意
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
return self.childViewControllers.count > 1;
}
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
-
NavigationController的侧滑返回功能
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 新增: 解决 1.解决其他的对viewController中手势通过实现手势代理方法处理,造成手势方法不识别,而出...
- 由于iPhone不像安卓手机那样底部有返回键可以点击返回上个页面,每次返回上一页都需要点击页面的导航栏返回按钮,这...