IOS 自定义 滑动返回 手势
/**
只需要在你自定义的导航控制器中,改成如下代码即可,自定义手势返回
*/
#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 自定义 滑动返回 手势相关推荐
- 【转】iOS右滑返回手势全解和最佳实施方案
序言 在ios7以后,苹果推出了手势滑动返回功能,也就是从屏幕左侧向右滑动可返回上一个界面.大大提高了APP在大屏手机和iPad上的操作体验,场景切换更加流畅.做右滑返回手势配置时,可能会遇到的 问题 ...
- iOS 一个丝滑的全屏滑动返回手势
原文链接:http://blog.sunnyxx.com/2015/06/07/fullscreen-pop-gesture/ 全屏返回手势 自 iOS7 之后,Apple 增加了屏幕边缘右划返回交互 ...
- [搬运] iOS 7 侧滑返回手势使用和错误集
原文:http://blog.sina.com.cn/s/blog_65c178a80102v0f4.html 前言: ios7开始 苹果增加了页面 右滑返回的效果:具体的是以UINavigation ...
- 苹果侧边滑动返回_一个丝滑的全屏滑动返回手势
全屏返回手势 自 iOS7 之后,Apple 增加了屏幕边缘右划返回交互的支持,再配合上 UINavigationController 的交互式动画,pop 到上一级页面的操作变的非常顺畅和丝滑,从此 ...
- iOS 禁用侧滑返回手势要点整理
项目中可能某些页面返回按钮需要自定义,然后在点击返回按钮时做出某些判断,或者直接弹出到根控制器,这时候需要禁用侧滑返回手势,防止它不走判断的代码直接返回上个界面. 网上找了些资料,大致方法有两种,但要 ...
- iOS 禁用侧滑返回手势
在页面的生命周期设置如下代码 - (void)viewDidAppear:(BOOL)animated{[super viewDidAppear:YES];// 禁用返回手势if ([self.nav ...
- ios 全屏返回手势
感谢前人的无私奉献. 简书原文 , 优化有bar,无bar的切换 前言 苹果在IOS7以后给导航控制器增加了一个Pop的手势,只要手指在屏幕边缘滑动,当前的控制器的视图就会跟随你的手指移动,当用户 ...
- iOS自定义长按手势,随意拖动Cell
起因 最近在做一个项目,要对UITableViewCell进行拖动蹂躏,具体效果如下: 本来打算用UIRespon这几个方法来做,最后发现在UITableViewController中这几个方法不会被 ...
- iOS 自定义返回按钮,保留系统滑动返回
1.简介 使用苹果手机,最喜欢的就是用它的滑动返回.作为一个开发者,我们在编写很多页面的时候,总是会因为这样那样的原因使得系统的滑动返回不可用.使用导航栏push出一个控制器,我们在控制器中自定义了一 ...
最新文章
- Eclipse 无限编译Invoking 'Maven Project Builder'导致卡主
- mybatis基本增删改查、缓存,延迟加载以及别名的配置
- 四大价值观和12准则
- python中output使用_python-02.输入Input/输出Output
- Pyqt5+python+ErIC6+QT designer
- c# ef报错_C# EF调用MySql出现“未将对象引用设置到对象的实例”错误解决方案
- 前端学习(1404):多人管理24joi验证
- MySQL 使用自增ID主键和UUID 作为主键的优劣比较详细过程(从百万到千万表记录测试)...
- Idea创建包以及导入jar包等操作
- CS API 测试3
- 无法在 DLL SqlServerSpatial110.dll 中找到名为 SetClrFeatureSwitchMap 解决方法
- ubuntu安装deep-wine下载qq,tim等文件
- 教你如何写出高效整洁的 css 代码——css优化(转载)
- 策略盈亏分布统计——从零到实盘11
- Unity3D基础知识学习笔记
- SolidWorks+thonny esp32 电磁控制,程序算法搞起来了,我的结构-仿真-电磁-控制-算法的学习之路
- [生存志] 第22节 历代大事件概览 五代十国
- SEO全称:Search Engine Optimization,即搜索引擎优化
- 汉诺塔 - 递归算法
- 培养人脉的106个技巧
热门文章
- 导入数据报错Packet for query is too large (20717492 4194304).
- android 5.0合并分区,中兴天极2 S291合并分区刷Android 5.1刷机教程
- scons 手册_SCons用户手册
- aliPay支付宝APP支付操作流程
- 中国科学院计算机专业职称,中国科学院关于高级工程师职务分级的意见
- (附源码)计算机毕业设计SSM基于ETC用户的自驾游推荐系统
- 测试dns的工具--rndc,dig命令----DNS排错,在线修改bind(nsupdate)
- 脉冲宽度调制_20160121
- 数字图像处理 - 相关资源整理
- java弹窗设置为不可关闭_javascript实现无法关闭的弹框