小胖说事29-----iOS中Navigation中左滑pop页面的三种方法
第三中类型。自己定义任何位置返回页面的方式,上边的类就是.m,大家能够贴过去使用。这个类是继承NavigationController的。用这个类初始化rootController就能够了。这里还有源代码可下载。完整的类:http://download.csdn.net/detail/haogaoming123/8906671
1.系统自带pop方法">系统自带pop方法
假设我们没有对navigation中的backbutton进行自己定义,我们能够直接使用系统自带的左滑pop方法。
可是假设我们对backbutton。进行了自己定义,我们就要对self.navigationController.interactivePopGestureRecognizer
这个属性进行设置了。关键代码:
__weak typeof(self) weakSelf = self;
self.navigationController.interactivePopGestureRecognizer.delegate = weakSelf;
以下是实例代码:
(继承AbeViewController类。就能够使用系统自带的pop方法。)
@interface AbeViewController ()<uigesturerecognizerdelegate>
@end @implementation AbeViewController
- (void)viewDidLoad {
[super viewDidLoad];
} - (void)viewDidAppear:(BOOL)animated{
//**************方法一****************//
//设置滑动回退
__weak typeof(self) weakSelf = self;
self.navigationController.interactivePopGestureRecognizer.delegate = weakSelf;
//推断是否为第一个view
if (self.navigationController && [self.navigationController.viewControllers count] == 1) {
self.navigationController.interactivePopGestureRecognizer.enabled = NO;
}
} #pragma mark- UIGestureRecognizerDelegate
//**************方法一****************//
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{
return YES;
} @end
2.自己定义边缘左滑手势方法
以下是实例代码:
就是实现了一个手势方法,触发这个手势方法时pop。(继承AbeViewController类,就能够使用自己定义边缘左滑手势的pop方法。
)
@interface AbeViewController ()<uigesturerecognizerdelegate>
@end
@implementation AbeViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)viewDidAppear:(BOOL)animated{
//*************方法二*****************//
UIScreenEdgePanGestureRecognizer *edgePanGestureRecognizer = [[UIScreenEdgePanGestureRecognizer alloc] initWithTarget:self action:@selector(edgePanGesture:)];
edgePanGestureRecognizer.delegate = self;
edgePanGestureRecognizer.edges = UIRectEdgeLeft;
[self.view addGestureRecognizer:edgePanGestureRecognizer];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
} #pragma mark- private method
//*************方法二*****************//
- (void)edgePanGesture:(UIScreenEdgePanGestureRecognizer*)edgePanGestureRecognizer{
[self.navigationController popViewControllerAnimated:YES];
}
#pragma mark- UIGestureRecognizerDelegate
//**************方法二****************//
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{
if (self.navigationController && [self.navigationController.viewControllers count] == 1) {
return NO;
}
return YES;
}
@end
3.自己定义view不论什么位置左移pop
事实上就是建立了一个UIPanGestureRecognizer手势,然后该手势触发方法。panGestureRecognizer.state pan的状态。
而且设置self.interactivePopGestureRecognizer.enabled = NO; 原生左滑无效
以下是实例代码:在view中,不论什么位置左移触发pop方法。
知识点:[panGestureRecognizer locationInView:XX] 获取pan手势的CGPoint。
(继承ABENavViewController类,就能够使用自己定义view左滑手势的pop方法; ABENavViewController为UINavigationController的子类。
//
// NavigationViewController.m
// BaseProject
//
// Created by haogaoming on 15/7/13.
// Copyright (c) 2015年 郝高明. All rights reserved.
// #import "NavigationViewController.h" @interface NavigationViewController () @property (nonatomic,strong) UIImageView *backview;
@property (nonatomic,strong) NSMutableArray *backImgs;
@property (nonatomic,assign) CGPoint panBeginPoint;
@property (nonatomic,assign) CGPoint panEndPoint; @end @implementation NavigationViewController - (id)init {
self = [super init];
self.delegate = self; return self;
}
- (id)initWithRootViewController:(UIViewController *)rootViewController {
self = [super initWithRootViewController:rootViewController];
self.delegate = self; return self;
} -(void)loadView
{
[super loadView];
self.backImgs = [NSMutableArray array];
} - (void)viewDidLoad {
[super viewDidLoad]; //原生方法无效
self.interactivePopGestureRecognizer.enabled = NO; //设置手势
[self.view AddGestureRecognizer:UIPanGestureRecognizerStyle delegate:self Section:@selector(panGestureRecognizerAction:)];
} - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
{
return (toInterfaceOrientation == UIInterfaceOrientationPortrait);
} - (BOOL)shouldAutorotate
{
return NO;
} -(UIViewController *)popViewControllerAnimated:(BOOL)animated
{
[_backImgs removeLastObject];
return [super popViewControllerAnimated:animated];
} - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated {
if (self.viewControllers.count==1) {
viewController.hidesBottomBarWhenPushed = YES;
}
//截图
UIGraphicsBeginImageContextWithOptions([UIScreen mainScreen].bounds.size, YES, 0.0f);
[[UIApplication sharedApplication].keyWindow.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
[self.backImgs addObject:img]; sleep(0.5); //防止没有截频成功
[super pushViewController:viewController animated:animated];
} #pragma make-method
-(void)panGestureRecognizerAction:(UIPanGestureRecognizer *)panGesture
{
if (self.viewControllers.count == 1) {
return;
} if (panGesture.state == UIGestureRecognizerStateBegan) {
//滑动開始
self.panBeginPoint = [panGesture locationInView:[UIApplication sharedApplication].keyWindow];
//插入图片
[self insertLastViewFromSuperView:self.view.superview];
}else if (panGesture.state == UIGestureRecognizerStateEnded){
//滑动结束
self.panEndPoint = [panGesture locationInView:[UIApplication sharedApplication].keyWindow];
if (self.view.left >= (self.view.width/2.0)-50) {
[UIView animateWithDuration:0.3 animations:^{
[self moveNavigationViewWithLength:[UIScreen mainScreen].bounds.size.width];
} completion:^(BOOL finished) {
[self removeLastViewFromSuperview];
[self moveNavigationViewWithLength:0];
[self popViewControllerAnimated:NO];
}];
}else{
[UIView animateWithDuration:0.3 animations:^{
[self moveNavigationViewWithLength:0];
}];
}
}else{
CGPoint point = [panGesture locationInView:[UIApplication sharedApplication].keyWindow];
//防止右滑
if ((point.x-self.panBeginPoint.x)<0) {
return;
}
[self moveNavigationViewWithLength:(point.x-self.panBeginPoint.x)];
}
}
/**
* 更改frame的位置
*
* @param lenght self.view的left位置
*/
-(void)moveNavigationViewWithLength:(CGFloat)lenght
{
//图片位置设置
self.view.frame = CGRectMake(lenght, self.view.top, self.view.width, self.view.height);
//图片动态阴影
_backview.alpha = (lenght/[UIScreen mainScreen].bounds.size.width)*2/3 + 0.5;
}
/**
* 将背景图插入到当前view的下边。然后通过改变self.view的frame实现滑动
*
* @param supView 画布
*/
-(void)insertLastViewFromSuperView:(UIView *)supView
{
//插入上一级视图背景
if (_backview == nil) {
_backview = [[UIImageView alloc]initWithFrame:[UIScreen mainScreen].bounds];
} _backview.image = [_backImgs lastObject];
[supView insertSubview:_backview belowSubview:self.view];}/** * 移除背景图 */-(void)removeLastViewFromSuperview{ [_backview removeFromSuperview]; _backview = nil;}- (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated.}@end
小胖说事29-----iOS中Navigation中左滑pop页面的三种方法的更多相关文章
- VC中加载LIB库文件的三种方法
VC中加载LIB库文件的三种方法 在VC中加载LIB文件的三种方法如下: 方法1:LIB文件直接加入到工程文件列表中 在VC中打开File View一页,选中工程名,单击鼠标右键,然后选中&quo ...
- Linux 中执行Shell 脚本的方式(三种方法)
Shell 脚本的执行方式通常有如下三种: (1)bash script-name 或者 sh script-name:(2)path/script-name或者./script-name:(3)so ...
- Java中实现十进制数转换为二进制的三种方法
第一种:除基倒取余法 这是最符合我们平时的数学逻辑思维的,即输入一个十进制数n,每次用n除以2,把余数记下来,再用商去除以2...依次循环,直到商为0结束,把余数倒着依次排列,就构成了转换后的二进制数 ...
- C#中Math类的计算整数的三种方法
1.Math.Round:四舍六入五取偶 引用内容 Math.Round( Math.Round( Math.Round( Math.Round( Math.Round( Math.Round( Ma ...
- 在一个JSP页面中包含另一个JSP页面的三种方式
转载自://http://blog.163.com/neu_lxb/blog/static/179417010201121343132918/ (1)include指令 includ ...
- PHP程序中删除字符串最后一个字符的三种方法
常见的语法格式: foreach ($arr as $key => $value) {$arr_str = $arr['x_id'] . ',' . $arr_str;} 假设字符数组 $arr ...
- 拦截iOS系统导航栏返回按钮事件-三种方法
方法一:在dealloc里面书写监听事件,因为只有pop才会调用dealloc,push不会掉用 - (void)dealloc {YLLog(@"123"); } 方法二:在- ...
- iOS边练边学--介绍布局的三种方法
使用代码实现Autolayout的方法1- 创建约束 +(id)constraintWithItem:(id)view1attribute:(NSLayoutAttribute)attr1relate ...
- php中使用Curl、socket、file_get_contents三种方法POST提交数据
抓取远程内容,之前一直都在用file_get_content函数,其实早就知道有curl这么一个好东西的存在,但是看了一眼后感觉使用颇有些复杂,没有file_get_content那么简单,再就是需求 ...
随机推荐
- JDK工具(零)--简要介绍JDK1.6自带的42个工具
Java的开发人员肯定都知道JDK的bin目录中有"java.exe"和"javac.exe"这两个命令行工具, 但并非所有的Java程序员都了解过JDK的bi ...
- 137 - ZOJ Monthly, November 2014 - J Poker Face
Poker Face Time Limit: 2 Seconds Memory Limit: 65536 KB As is known to all, coders are lack of ...
- [DLX精确覆盖+打表] hdu 2518 Dominoes
题意: 就是给12种图形,旋转,翻折.有多少种方法构成n*m=60的矩形 思路: 裸的精确覆盖.就是建图麻烦 个人太挫,直接手写每一个图形的各种形态 须要注意的是最后的答案须要除以4 代码: #inc ...
- 怎样使Dialog像Activity一样随心所欲的使用?
怎样使Dialog像Activity一样随心所欲的使用? android中的Dialog像是寄生在Activity中.在弹出Dialog时.因受到系统风格定义,导致Dialog怎么也不能如意,那么今天 ...
- !HDU 2602 Bone Collector--DP--(裸01背包)
题意:这题就是一个纯粹的裸01背包 分析:WA了好几次.01背包实现的一些细节没搞懂 1.为什么dp[i][j]赋初值为0而不是value[i].由于第i个石头可能不放! 2.在进行状态转移之前要dp ...
- LeetCode 107 Binary Tree Level Order Traversal II(二叉树的层级顺序遍历2)(*)
翻译 给定一个二叉树,返回从下往上遍历经过的每一个节点的值. 从左往右,从叶子到节点. 比如: 给定的二叉树是 {3,9,20,#,#,15,7}, 3 / \ 9 20 / \ 15 7 返回它从下 ...
- codeforces 558E A Simple Task 线段树
题目链接 题意较为简单. 思路: 由于仅仅有26个字母,所以用26棵线段树维护就好了,比較easy. #include <iostream> #include <string> ...
- .Net 安装aliyun-oss
NuGet安装 如果您的Visual Studio没有安装NuGet,请先安装 NuGet. 安装好NuGet后,先在Visual Studio中新建或者打开已有的项目,然后选择工具 > NuG ...
- axure中使用HighCharts模板制作统计图表
一. 步骤: 1.在axure中新建页面,发布并生成html文件: 2.将HighCharts文件夹,拷贝到生成的html文件中: 3.拖拽“内部框架组件”到界面中 4.双击界面中的内部框架,设置链接 ...
- 微信公众号开发(二)获取AccessToken、jsapi_ticket
Access Token 在微信公众平台接口开发中,Access Token占据了一个很重要的地位,相当于进入各种接口的钥匙,拿到这个钥匙才有调用其他各种特殊接口的权限. access_token是公 ...