美文网首页郭志敏的程序员书屋iOSiOS
iOS--无需写代码实现全屏滑动手势

iOS--无需写代码实现全屏滑动手势

作者: 改变自己_now | 来源:发表于2016-11-08 08:51 被阅读1557次

一、由于公司项目中需要实现全屏返回pop手势的功能,于是想着去github上找找看有没有现成的,搜了挺多的,发现都不能满足我的需求。

需求:1、支持全屏手势,滑到不到一半的时候要返回(产品的要求,说要灵敏一点)
2、在有些页面需要禁用全屏的滑动手势

github上也有大家用的常用的FDFullscreenPopGesture,不过不能支持定制滑动返回比例,于是自己撸一个。

二、Talk is cheap Show me the code

废话不多说,先看看实现的大概效果。

YJNavigationFullGesture.gif

从iOS7系统开始就有滑动返回手势,不过不是全屏的,只有在边缘的时候才能触发,FDFullscreenPopGesture的作者就是调用系统的私有api去实现的。
我的实现思路很简单:就是自定义交互动画和pop动画去实现,核心代码如下:

// 获取本身的手势并禁用
UIGestureRecognizer *geture = self.interactivePopGestureRecognizer;

geture.enabled = NO;

//自定义pan手势

UIView *getureView = geture.view;
UIPanGestureRecognizer *popGesture = [[UIPanGestureRecognizer alloc] init];
popGesture.delegate = self.yj_gestureDelegate;
popGesture.maximumNumberOfTouches = 1;
[getureView addGestureRecognizer:popGesture];

// 自定义的交互动画
self.yj_interactiveTransition = [[YJInteractiveTransition alloc] initWithViewController:self];

self.yj_interactiveTransition.popProgross = self.yj_popProgress?self.yj_popProgress:0.5;

[popGesture addTarget:self.yj_interactiveTransition action:@selector(handlePopGesture:)];

我开始的思路是写了个UINavigationController的子类去实现,后面感觉继承不是特别的好,于是就写了UINavigationController分类去实现。这样的话只要把我的文件拖到工程中,不需要写任何代码就能支持全屏手势了。

1、如果需要自定pop滑动动比例需要

#import "UINavigationController+YJFullGesture.h"

self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];    
UINavigationController *navi = [[UINavigationController alloc] initWithRootViewController:[ViewController new]];

// 设置滑动比例,不设置的话默认为0.5,
navi.yj_popProgress = 0.35;



self.window.rootViewController = navi;

[self.window makeKeyAndVisible];

2、禁用手势的话,在需要push的controller来设置,#import "UIViewController+YJFullGesture.h"

// 关闭全屏手势,默认为开启
self.yj_disabledFullGesture = YES;

具体实现去看YJNavigationFullGesture,如果需要用到的话下载下来拖入工程即可,同时也支持cocopods安装。

相关文章

网友评论

  • 大灰灰iOS:pan手势会和一些手势冲突,比如cell删除,tableview上下划,右滑返回到一半的时候还能上下动,我之前的产品经理表示无法接受。。。
    改变自己_now:@大灰灰iOS :joy:
    大灰灰iOS:@为谁而鸣 可以判断,但是比较繁琐。。tableView得再套一层或者给catagory
    改变自己_now: @大灰灰iOS 不会吧,我项目中用的可以啊。冲突的话可以用手势代理方法里面判断吧?
  • yzhxcql:self.yj_popProgress?:0.5; 就行了
    改变自己_now:@Adoma 谢谢,我改下,学到了。

本文标题:iOS--无需写代码实现全屏滑动手势

本文链接:https://www.haomeiwen.com/subject/cokauttx.html