当前位置: 首页 > 科技观察

8行代码教你如何获得导航控制器的全屏滑动返回效果

时间:2023-03-12 13:42:53 科技观察

前言本文是关于导航控制器的全屏滑动返回效果,代码量非常少,并且它可以在10行内完成。效果如图:喜欢我的文章可以关注我,也可以来小猫学习我们的iOS培训课程。以后会陆续更新...1.自定义导航控制器的用途:以后如果需要使用全屏滑回功能,就使用自己定义的导航控制器。2、分析导航控制器侧滑功能的效果:导航控制器默认自带侧滑功能。当用户在界面左侧滑动时,会出现侧滑功能。系统自带的侧滑效果:分析:1、navigationcontroller的view自带滑动手势,但是手势的触发范围只能在左边。2、当用户在界面左侧拖动时,会触发滑动手势方法,并且有滑动返回功能,也就是说系统手势触发的方法已经实现了滑动返回功能。3、为什么说系统手势触发的方法实现了滑动返回功能?原因:创建滑动手势对象时,需要绑定一个监听器,手势触发时会调用目标动作。1UIPanGestureRecognizer*pan=[[UIPanGestureRecognizeralloc]initWithTarget:targetaction:action];当用户在界面左侧滑动时,有滑回功能。这是因为触发了手势,调用了target的action方法,说明滑动返回功能是在action方法内部实现的。否则不会有回滑效果。3.实现全屏滑动功能分析打印导航控制器自带的滑动手势,一睹其真面目。系统内置滑动手势interactivePopGestureRecognizer//self指向的导航控制器在导航控制器的viewDidLoad方法中打印-(void)viewDidLoad{[superviewDidLoad];NSLog(@"%@",self.interactivePopGestureRecognizer);}打印结果图片:从图中可以看出:1.系统自带的手势是一个UIScreenEdgePanGestureRecognizer类型的对象,屏幕边缘滑动手势2.系统自带的手势目标是一个类型的对象_UINavigationInteractiveTransition3.target调用的action方法叫handleNavigationTransition:Analysis:UIScreenEdgePanGestureRecognizer,从名字就可以看出这个手势的范围只能在屏幕周围,因为这个手势,系统自带的滑动效果只能实现侧滑。4、如何实现全屏滑动功能在自己的导航控制器中添加一个全屏滑动手势,在系统中调用滑动手势目标的action方法,使用系统实现的滑动返回功能,以及添加您自己的全屏滑动手势,您现在将拥有全屏滑动功能。问题:如何获取系统自带的目标对象?动作方法的名称是已知的,系统必须在目标对象中实现。只需获取目标对象并调用此方法即可。通过打印系统自带的滑动手势的代理,发现正好是_UINavigationInteractiveTransition对象,所以我猜测这个代理对象就是目标对象。只要获取到,就会获取到系统自带的滑动手势的目标对象。//打印系统内置滑动手势的代理对象SLog(@"%@",self.interactivePopGestureRecognizer.delegate);打印图片:导航控制器全屏滑动注意事项:1.不要使用系统自带的滑动手势。2.只有navigationcontroller的非rootcontroller需要触发手势,使用手势代理来控制手势触发。全屏滑动代码实现-(void)viewDidLoad{[superviewDidLoad];//获取系统自带滑动手势的目标对象idtarget=self.interactivePopGestureRecognizer.delegate;//创建全屏滑动手势并调用目标动作系统自带的滑动手势MethodUIPanGestureRecognizer*pan=[[UIPanGestureRecognizeralloc]initWithTarget:targetaction:@selector(handleNavigationTransition:)];//设置手势代理,拦截手势触发pan.??delegate=self;//添加全屏滑动手势到导航控制器的视图[self.viewaddGestureRecognizer:pan];//禁止使用系统自带的滑动手势self.interactivePopGestureRecognizer.enabled=NO;}//何时调用:在每个手势触发之前,将询问代理是否触发它。//功能:拦截手势触发-(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer*)gestureRecognizer{//注意:只有非根控制器有滑动返回功能,根控制器没有。//判断导航控制器是否只有一个子控制器,如果只有一个子控制器,则一定是根控制器if(self.childViewControllers.count==1){//表示用户在根控制器界面,无需触发滑动手势,returnNO;}returnYES;}联系方式如果喜欢本文,可以继续关注我,微博:阿昭,欢迎交流。