/**

  只需要在你自定义的导航控制器中,改成如下代码即可,自定义手势返回

*/

#define KEY_WINDOW [[UIApplication sharedApplication] keyWindow]

#define kScreenW KEY_WINDOW.bounds.size.width

#define kAnimateDuration 0.3

#define kDefaultAlapa 0.5

#define kDefaultScale 0.95

#define iOS7 ([UIDevice currentDevice].systemVersion.floatValue >= 7.0)

#import "CXNavigationController.h"

#import <QuartzCore/QuartzCore.h>

@interfaceCXNavigationController ()

{

NSMutableArray *_images; //图片数组

UIView *_bgView; //背景图

UIView *_blankMask; //面罩

UIImageView *_imageView; //图像

CGPoint _startPoint; //开始接触点

}

@end

@implementation CXNavigationController

- (void)viewDidLoad{

[superviewDidLoad];

_images = [NSMutableArrayarray];

if (!iOS7) {

UIPanGestureRecognizer *pan = [[UIPanGestureRecognizeralloc] initWithTarget:selfaction:@selector(panMove:)];

[self.viewaddGestureRecognizer:pan];

}

}

- (void)panMove:(UIPanGestureRecognizer *)pan{

if (self.viewControllers.count <= 1) {

return;

}

CGRect selfF = self.view.frame;

CGPoint location = [pan locationInView:KEY_WINDOW];

if (pan.state == UIGestureRecognizerStateBegan) { //开始拖拽

_startPoint = location;

_imageView.image = [_imageslastObject];

[KEY_WINDOWinsertSubview:_bgViewbelowSubview:self.tabBarController.view];

_imageView.transform = CGAffineTransformMakeScale(kDefaultScale, kDefaultScale);

}elseif(pan.state == UIGestureRecognizerStateChanged){ //拖拽中

CGFloat marginX = location.x - _startPoint.x;

marginX = marginX > kScreenW ? kScreenW : marginX;

marginX = marginX < 0 ? 0 : marginX;

selfF.origin.x = marginX;

self.view.frame = selfF;

CGFloat scale = kDefaultScale + marginX * 1.0 / 6400;

scale = marginX == kScreenW ? 0.5 : scale;

scale = marginX == 0 ? 0 : scale;

_imageView.transform = CGAffineTransformMakeScale(scale, scale);

CGFloat alpha = kDefaultAlapa - (1 - kDefaultAlapa) * marginX * 1.0 / kScreenW;

alpha = marginX == kScreenW ? kDefaultAlapa : alpha;

alpha = marginX == 0 ? 0 : alpha;

_blankMask.alpha = alpha;

}elseif(pan.state == UIGestureRecognizerStateEnded){ //结束

CGFloat marginX = location.x - _startPoint.x;

if (marginX > 50) {

marginX = marginX > kScreenW ? kScreenW : marginX;

CGFloat dur = kAnimateDuration - marginX * 1.0 / 2000;

[UIViewanimateWithDuration:dur animations:^{

CGRect selfF = self.view.frame;

selfF.origin.x = KEY_WINDOW.bounds.size.width;

self.view.frame = selfF;

_blankMask.alpha = 0;

_imageView.transform = CGAffineTransformMakeScale(1, 1);

} completion:^(BOOL finished) {

[_images removeLastObject];

[_bgView removeFromSuperview];

CGRect rect = self.view.frame;

rect.origin.x = 0;

self.view.frame = rect;

[superpopViewControllerAnimated:NO];

}];

}else{

CGFloat marginX = location.x - _startPoint.x;

marginX = marginX > 50 ? 50 : marginX;

marginX = marginX < 0 ? 0 : marginX;

CGFloat dur = marginX * 1.0 / 500;

[UIViewanimateWithDuration:0.1 + dur  animations:^{

CGRect selfF = self.view.frame;

selfF.origin.x = 0;

self.view.frame = selfF;

}];

}

}

}

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated{

if (self.viewControllers.count > 0) {

if (!iOS7) {

[self createBg];

}

}

[super pushViewController:viewController animated:animated];

}

#pragma mark 创建背景

- (void)createBg{

[_imagesaddObject:[selfcurrentScreenImage]];

if (!_bgView) {

_bgView = [[UIView alloc] initWithFrame:KEY_WINDOW.bounds];

_bgView.backgroundColor = [UIColorblackColor];

_imageView = [[UIImageView alloc] initWithFrame:KEY_WINDOW.bounds];

_imageView.backgroundColor = [UIColorclearColor];

[_bgViewaddSubview:_imageView];

_blankMask = [[UIView alloc] initWithFrame:KEY_WINDOW.bounds];

_blankMask.backgroundColor = [UIColorblackColor];

_blankMask.alpha = kDefaultAlapa;

[_bgViewaddSubview:_blankMask];

}

}

#pragma mark 获取当期屏幕

- (UIImage *)currentScreenImage{

UIGraphicsBeginImageContextWithOptions(KEY_WINDOW.bounds.size, self.view.opaque, 0.0);

if (self.topViewController.tabBarController) {

[self.topViewController.tabBarController.view.layerrenderInContext:UIGraphicsGetCurrentContext()];

}else{

[self.view.layerrenderInContext:UIGraphicsGetCurrentContext()];

}

UIImage * img = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

return img;

}

转载于:https://www.cnblogs.com/d2688/p/3773145.html

IOS 自定义 滑动返回 手势相关推荐

  1. 【转】iOS右滑返回手势全解和最佳实施方案

    序言 在ios7以后,苹果推出了手势滑动返回功能,也就是从屏幕左侧向右滑动可返回上一个界面.大大提高了APP在大屏手机和iPad上的操作体验,场景切换更加流畅.做右滑返回手势配置时,可能会遇到的 问题 ...

  2. iOS 一个丝滑的全屏滑动返回手势

    原文链接:http://blog.sunnyxx.com/2015/06/07/fullscreen-pop-gesture/ 全屏返回手势 自 iOS7 之后,Apple 增加了屏幕边缘右划返回交互 ...

  3. [搬运] iOS 7 侧滑返回手势使用和错误集

    原文:http://blog.sina.com.cn/s/blog_65c178a80102v0f4.html 前言: ios7开始 苹果增加了页面 右滑返回的效果:具体的是以UINavigation ...

  4. 苹果侧边滑动返回_一个丝滑的全屏滑动返回手势

    全屏返回手势 自 iOS7 之后,Apple 增加了屏幕边缘右划返回交互的支持,再配合上 UINavigationController 的交互式动画,pop 到上一级页面的操作变的非常顺畅和丝滑,从此 ...

  5. iOS 禁用侧滑返回手势要点整理

    项目中可能某些页面返回按钮需要自定义,然后在点击返回按钮时做出某些判断,或者直接弹出到根控制器,这时候需要禁用侧滑返回手势,防止它不走判断的代码直接返回上个界面. 网上找了些资料,大致方法有两种,但要 ...

  6. iOS 禁用侧滑返回手势

    在页面的生命周期设置如下代码 - (void)viewDidAppear:(BOOL)animated{[super viewDidAppear:YES];// 禁用返回手势if ([self.nav ...

  7. ios 全屏返回手势

    感谢前人的无私奉献.  简书原文 ,  优化有bar,无bar的切换 前言 苹果在IOS7以后给导航控制器增加了一个Pop的手势,只要手指在屏幕边缘滑动,当前的控制器的视图就会跟随你的手指移动,当用户 ...

  8. iOS自定义长按手势,随意拖动Cell

    起因 最近在做一个项目,要对UITableViewCell进行拖动蹂躏,具体效果如下: 本来打算用UIRespon这几个方法来做,最后发现在UITableViewController中这几个方法不会被 ...

  9. iOS 自定义返回按钮,保留系统滑动返回

    1.简介 使用苹果手机,最喜欢的就是用它的滑动返回.作为一个开发者,我们在编写很多页面的时候,总是会因为这样那样的原因使得系统的滑动返回不可用.使用导航栏push出一个控制器,我们在控制器中自定义了一 ...

最新文章

  1. Eclipse 无限编译Invoking 'Maven Project Builder'导致卡主
  2. mybatis基本增删改查、缓存,延迟加载以及别名的配置
  3. 四大价值观和12准则
  4. python中output使用_python-02.输入Input/输出Output
  5. Pyqt5+python+ErIC6+QT designer
  6. c# ef报错_C# EF调用MySql出现“未将对象引用设置到对象的实例”错误解决方案
  7. 前端学习(1404):多人管理24joi验证
  8. MySQL 使用自增ID主键和UUID 作为主键的优劣比较详细过程(从百万到千万表记录测试)...
  9. Idea创建包以及导入jar包等操作
  10. CS API 测试3
  11. 无法在 DLL SqlServerSpatial110.dll 中找到名为 SetClrFeatureSwitchMap 解决方法
  12. ubuntu安装deep-wine下载qq,tim等文件
  13. 教你如何写出高效整洁的 css 代码——css优化(转载)
  14. 策略盈亏分布统计——从零到实盘11
  15. Unity3D基础知识学习笔记
  16. SolidWorks+thonny esp32 电磁控制,程序算法搞起来了,我的结构-仿真-电磁-控制-算法的学习之路
  17. [生存志] 第22节 历代大事件概览 五代十国
  18. SEO全称:Search Engine Optimization,即搜索引擎优化
  19. 汉诺塔 - 递归算法
  20. 培养人脉的106个技巧

热门文章

  1. 导入数据报错Packet for query is too large (20717492 4194304).
  2. android 5.0合并分区,中兴天极2 S291合并分区刷Android 5.1刷机教程
  3. scons 手册_SCons用户手册
  4. aliPay支付宝APP支付操作流程
  5. 中国科学院计算机专业职称,中国科学院关于高级工程师职务分级的意见
  6. (附源码)计算机毕业设计SSM基于ETC用户的自驾游推荐系统
  7. 测试dns的工具--rndc,dig命令----DNS排错,在线修改bind(nsupdate)
  8. 脉冲宽度调制_20160121
  9. 数字图像处理 - 相关资源整理
  10. java弹窗设置为不可关闭_javascript实现无法关闭的弹框