通过 UIPanGestureRecognizer  手势来控制侧拉view的显示

在QHLViewController.m文件中,先添加一些宏定义和参数等等。

#define QHLAnimatingDuration 0.5
#define QHLMainViewMaxOffsetX 250
#define QHLLeftViewOriginX -50 typedef enum{
QHLViewControllerStateClosed = ,
QHLViewControllerStateOpening,
QHLViewControllerStateOpened,
QHLViewControllerStateClosing
}QHLViewControllerState; @interface QHLViewController ()<UITableViewDataSource> @property (nonatomic, assign) CGPoint point;
@property (nonatomic, assign) CGPoint location;
@property (nonatomic, strong) UIView *leftV;
@property (nonatomic, strong) UIView *mainV; @property (nonatomic, strong) UITapGestureRecognizer *tapGesTureR;
@property (nonatomic, strong) UIPanGestureRecognizer *panGesTureR;
@property (nonatomic, assign) QHLViewControllerState state;
@end

在viewWillAppear:(BOOL)animated方法中,创建需要的leftV和mainV这两个view

- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated]; //创建并设置leftV的属性
UITableView *leftV = [[UITableView alloc] initWithFrame:CGRectMake(QHLLeftViewOriginX, , self.view.bounds.size.width, self.view.bounds.size.height)];
leftV.backgroundColor = [UIColor whiteColor];
leftV.dataSource = self;
self.leftV = leftV;
[self.view addSubview:leftV]; //创建并设置mainView的属性
UIView *mainV = [[UIView alloc] initWithFrame:self.view.bounds];
mainV.backgroundColor = [UIColor purpleColor];
self.mainV = mainV;
[self.view addSubview:mainV];
}

在viewDidLoad中先设置自身的状态为关闭,创建拖动和点击的手势,并且先添加拖动手势到控制器

- (void)viewDidLoad {
[super viewDidLoad];
//设置默认状态下自身控制器的state状态
self.state = QHLViewControllerStateClosed; //添加拖动手势
self.panGesTureR = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(observePanGestureRecognizer:)];
[self.view addGestureRecognizer:self.panGesTureR]; //设置点击手势
self.tapGesTureR =[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(observeTapGesTureRecognizer:)];
}

根据手势的不同状态来实现手势的触发方法,在不同手势状态下,给自身设置不同的state。

/**
* 拖动手势的实现方法
*/
- (void)observePanGestureRecognizer:(UIPanGestureRecognizer *)panGestureRecognizer {
//获取当前拖动手势的状态
UIGestureRecognizerState state = panGestureRecognizer.state; CGPoint location = [panGestureRecognizer locationInView:self.view]; //位置 CGRect main = self.mainV.frame;
CGRect left = self.leftV.frame; switch (state) {
//手势开始时候
case UIGestureRecognizerStateBegan:
//获取开始位置的point
self.point = location; //根据手势触发之前的自身状态来设置现在的状态
if (self.state == QHLViewControllerStateClosed) {
self.state = QHLViewControllerStateOpening; //opening
} else {
self.state = QHLViewControllerStateClosing; //closing
}
break; //手势变化时候
case UIGestureRecognizerStateChanged:
{
//偏移量x
CGFloat offsetX = ; //下面2种情况,offsetX都是大于等于0的
if (self.state == QHLViewControllerStateOpening) { //此时自身状态只有QHLViewControllerStateOpening和QHLViewControllerStateClosing
offsetX = location.x - self.point.x;
} else {
offsetX = QHLMainViewMaxOffsetX - (self.point.x - location.x);
} if (offsetX > QHLMainViewMaxOffsetX) { left.origin.x = ;
main.origin.x = QHLMainViewMaxOffsetX;
} else if (offsetX < ) { left.origin.x = QHLLeftViewOriginX;
main.origin.x = ;
}else { main.origin.x = offsetX;
left.origin.x = QHLLeftViewOriginX - offsetX * QHLLeftViewOriginX / QHLMainViewMaxOffsetX;
}
self.mainV.frame = main;
self.leftV.frame = left;
break;
}
//手势结束时候
case UIGestureRecognizerStateEnded:
{ //结束之前的那一刻,只会有2种状态 QHLViewControllerStateOpening 和 QHLViewControllerStateClosing
CGFloat endX = main.origin.x; if (self.state == QHLViewControllerStateOpening) { // x 取值 >= 0 if (endX == QHLMainViewMaxOffsetX) { // 结束时候的 x 取最大值 self.state = QHLViewControllerStateOpened;
} else if (endX > QHLMainViewMaxOffsetX / ) { // 结束时候的 x 大于 最大值的 1/2 [self animatingOpen];
} else { // 结束时候的 x 小于 最大值的 1/2 [self animatingClose];
} } else { // x 取值 0 ~ 250 if (endX > QHLMainViewMaxOffsetX / ) {
[self animatingOpen];
} else {
[self animatingClose];
}
}
break;
}
}
}

点击手势要等mainV偏移量达到最大的时候才添加进去!!!

/**
* 点击手势的实现方法
*/
- (void)observeTapGesTureRecognizer:(UITapGestureRecognizer *)tapGestureRecognizer {
[UIView animateWithDuration:QHLAnimatingDuration animations:^{
self.mainV.frame = [UIScreen mainScreen].bounds;
self.leftV.frame = CGRectMake(QHLLeftViewOriginX, , self.view.frame.size.width, self.view.frame.size.height);
} completion:^(BOOL finished) {
self.state = QHLViewControllerStateClosed;
}];
}

当mainV的偏移量达到一定要求后就会调用下面2个方法

当以动画形式打开 在完成时候,添加点击手势

当以动画形式关闭 在完成时候,移除点击手势

/**
* 以动画形式打开
*/
- (void)animatingOpen {
CGRect main = self.mainV.frame; [UIView animateWithDuration:0.5 delay: usingSpringWithDamping:0.7 initialSpringVelocity:0.7 options:UIViewAnimationOptionAllowAnimatedContent animations:^{
self.mainV.frame = CGRectMake(QHLMainViewMaxOffsetX, , main.size.width, main.size.height);
self.leftV.frame = self.view.bounds;
} completion:^(BOOL finished) {
//设置state状态
self.state = QHLViewControllerStateOpened;
//添加点击手势
[self.mainV addGestureRecognizer:self.tapGesTureR];
}];
} /**
* 以动画形式关闭
*/
- (void)animatingClose {
CGRect main = self.mainV.frame; [UIView animateWithDuration:0.5 delay: usingSpringWithDamping:1.0 initialSpringVelocity:0.7 options:UIViewAnimationOptionAllowAnimatedContent animations:^{
self.mainV.frame = self.view.bounds;
self.leftV.frame =CGRectMake(QHLLeftViewOriginX, , main.size.width, main.size.height);
} completion:^(BOOL finished) {
//设置state状态
self.state = QHLViewControllerStateClosed;
//移除点击手势
[self.mainV removeGestureRecognizer:self.tapGesTureR];
}];
}

侧拉leftV的dataSource方法

#pragma mark - table view delegate & data source
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return ;
} - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *ID = @"cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID]; if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
} cell.textLabel.text = [NSString stringWithFormat:@"Message - %ld",(long)indexPath.row]; return cell;
}

对于QQ左上角按钮点击之后弹出的设置页面   导航控制器的bar和底部的tabBar会跟随着移动,有知道的大牛给点思路!!!!

渣渣已经脑细胞死光了v_v

简单的拖动手势控制侧拉view显示的更多相关文章

  1. Swift实战-豆瓣电台(九)简单手势控制暂停播放(全文完)

    Swift实战-豆瓣电台(九)简单手势控制暂停播放 全屏清晰观看地址:http://www.tudou.com/programs/view/tANnovvxR8U/ 这节我们主要讲UITapGestu ...

  2. iOS 开发笔记-控制器tab切换view显示

    在开发过程中,我们常常会碰到一种情况就是,在一个controller里面,经常要放很多复杂的控制,最常用的就是tar切换.tar切换,原理就是在一个controller里面,显示另一个controll ...

  3. [IOS Tableview] cell自定义view显示错误问题

    问题介绍:按照tableviewcell的tag自定义cell的view显示的时候,会出现拖动时显示错误情况(在Tableview的范围超出屏幕范围需要滑动的情况下). 我做的是一个下载界面,我为了简 ...

  4. AChartEngine使用View显示图表

    学习过AChartEngine的人肯定都知道,使用ChartFactory创建一张图表可以使用Intent方法,之后调用StartActivity来启用这个Intent,但是这么左右一个坏处,就是当你 ...

  5. Android点击View显示PopupWindow,再次重复点击View关闭PopupWindow

     Android点击View显示PopupWindow,再次重复点击View关闭PopupWindow 这本身是一个看似很简单的问题,但是如果设置不当,就可能导致莫名其妙失效问题.通常在Andro ...

  6. jQuery控制TR的显示隐藏

    网上有很多,这里介绍三种: 第一种方法,就是使用id,这个方法可以在生成html的时候动态设置tr的id,也是用得最多最简单的一种,如下: <table> <tr><td ...

  7. Unity3D中使用Leap Motion进行手势控制

    Leap Motion作为一款手势识别设备,相比于Kniect,长处在于准确度. 在我的毕业设计<场景漫游器>的开发中.Leap Motion的手势控制作为重要的一个环节.以此,谈谈开发中 ...

  8. Spring Security 整合freemaker 实现简单登录和角色控制

    Spring Security 整合freemaker 实现简单登录和角色控制     写这篇文章是因为我做了一个电商网站项目,近期刚加上权限控制.整个过程很简单,在此给大家梳理一下,也算是自己对知识 ...

  9. MIT 黑科技:通过脑电波和手势控制机器人

    简评:麻省理工黑科技,虽然现在能实现的操作还很简单,但前景(想象空间)非常巨大. 通常,控制机器人并不容易,常规手段就是编程.但是地球上从来不缺天马行空的科学家,今日 MIT 的计算机科学与人工智能实 ...

随机推荐

  1. silverlight visifire控件图表制作——silverlight 后台方法打印

    一.后台方法 1.添加引用:using System.Windows.Printing; 2.全局变量://定义图片和文本打印变量  PrintDocument printImage; 3.构造方法体 ...

  2. Jboss基础及简单的应用

    初学Jboss,对于Jboss的基础认识以及配置做一些记录 Jboss基础: JBoss是什么–基于J2EE的应用服务器–开放源代码–JBoss核心服务不包括支持servlet/JSP的WEB容器,一 ...

  3. BZOJ4195 NOI2015 程序自动分析

    4195: [Noi2015]程序自动分析 Time Limit: 10 Sec Memory Limit: 512 MB Description 在实现程序自动分析的过程中,常常需要判定一些约束条件 ...

  4. The Definitive C++ Book Guide and List

    学习c++的书单 转自 http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list Beginner ...

  5. Mysql学习(慕课学习笔记5)约束

    约束类型: 1.NOT NULL (非空约束) 2.PRIMARY KEY(主键约束) 每张数据表只能存在一个主键 主键保证记录的唯一性 主键自动为NOT NULL (Auto_increment  ...

  6. 慕课linux学习笔记(九)常用命令(6)

    关机与重启命令 Shutdown [选项] 时间 -c 取消前一个关机命令 -h 关机 -r 重启 Shutdown -r now 其他关机命令 Halt Poweroff Init 0 其他重启命令 ...

  7. 【Nutch基础教程之七】Nutch的2种运行模式:local及deploy

    在对nutch源代码运行ant runtime后,会创建一个runtime的目录,在runtime目录下有deploy和local 2个目录. [jediael@jediael runtime]$ l ...

  8. 一个很简单的jQuery插件实例教程(菜鸟级)

    很多公司的前端设计开发人员都是女孩子,而这些女孩子很多JavaScript技能都不是很好.而前端开发过程中,JavaScript技能又是必不可少的.所以,如果前端小MM正在为某个JavaScript效 ...

  9. python中的StringIO模块

    python中的StringIO模块 标签:python StringIO 此模块主要用于在内存缓冲区中读写数据.模块是用类编写的,只有一个StringIO类,所以它的可用方法都在类中.此类中的大部分 ...

  10. Song of Pi

    def main(): pi = ' # 预先给出需要比较的值 t = int(raw_input()) for _ in xrange(t): song = raw_input().strip(). ...