简单的拖动手势控制侧拉view显示
通过 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显示的更多相关文章
- Swift实战-豆瓣电台(九)简单手势控制暂停播放(全文完)
Swift实战-豆瓣电台(九)简单手势控制暂停播放 全屏清晰观看地址:http://www.tudou.com/programs/view/tANnovvxR8U/ 这节我们主要讲UITapGestu ...
- iOS 开发笔记-控制器tab切换view显示
在开发过程中,我们常常会碰到一种情况就是,在一个controller里面,经常要放很多复杂的控制,最常用的就是tar切换.tar切换,原理就是在一个controller里面,显示另一个controll ...
- [IOS Tableview] cell自定义view显示错误问题
问题介绍:按照tableviewcell的tag自定义cell的view显示的时候,会出现拖动时显示错误情况(在Tableview的范围超出屏幕范围需要滑动的情况下). 我做的是一个下载界面,我为了简 ...
- AChartEngine使用View显示图表
学习过AChartEngine的人肯定都知道,使用ChartFactory创建一张图表可以使用Intent方法,之后调用StartActivity来启用这个Intent,但是这么左右一个坏处,就是当你 ...
- Android点击View显示PopupWindow,再次重复点击View关闭PopupWindow
Android点击View显示PopupWindow,再次重复点击View关闭PopupWindow 这本身是一个看似很简单的问题,但是如果设置不当,就可能导致莫名其妙失效问题.通常在Andro ...
- jQuery控制TR的显示隐藏
网上有很多,这里介绍三种: 第一种方法,就是使用id,这个方法可以在生成html的时候动态设置tr的id,也是用得最多最简单的一种,如下: <table> <tr><td ...
- Unity3D中使用Leap Motion进行手势控制
Leap Motion作为一款手势识别设备,相比于Kniect,长处在于准确度. 在我的毕业设计<场景漫游器>的开发中.Leap Motion的手势控制作为重要的一个环节.以此,谈谈开发中 ...
- Spring Security 整合freemaker 实现简单登录和角色控制
Spring Security 整合freemaker 实现简单登录和角色控制 写这篇文章是因为我做了一个电商网站项目,近期刚加上权限控制.整个过程很简单,在此给大家梳理一下,也算是自己对知识 ...
- MIT 黑科技:通过脑电波和手势控制机器人
简评:麻省理工黑科技,虽然现在能实现的操作还很简单,但前景(想象空间)非常巨大. 通常,控制机器人并不容易,常规手段就是编程.但是地球上从来不缺天马行空的科学家,今日 MIT 的计算机科学与人工智能实 ...
随机推荐
- PHP中PDO DEMO
PDO => PHP DATABASE OBJECT 1.Select $dsn = "mysql:host=127.0.0.1;port=3306;dbname=dbname&quo ...
- 学习CAS实现SSO单点登录
学习CAS实现SSO单点登录 网上找了几篇比较详细的教程,在这记录一下: 原理: CAS实现SSO单点登录原理 教程: 1.CAS实现单点登录(SSO)经典完整教程 2.SSO之CAS单点登录实例演示 ...
- 基尔霍夫矩阵题目泛做(AD第二轮)
题目1: SPOJ 2832 题目大意: 求一个矩阵行列式模一个数P后的值.p不一定是质数. 算法讨论: 因为有除法而且p不一定是质数,不一定有逆元,所以我们用辗转相除法. #include < ...
- C# ITextSharp pdf 自动打印
PDF生成后直接进入打印预览不用下载 using iTextSharp.text; using iTextSharp.text.pdf; Document pdfDoc = new Document( ...
- 35个jQuery小技巧(转)
1. 禁止右键点击$(document).ready(function(){ $(document).bind("contextmenu",function(e){ ...
- 帝国cms7.0整合百度编辑器ueditor教程
帝国cms7.0整合百度编辑器ueditor教程开始 1.根据自己使用的帝国cms版本编码下载对应的ueditor版本 下载地址 http://ueditor.baidu.com/website/do ...
- [转]详解AppDelegate/UIApplication
一.UIApplication 1.简单介绍 (1)UIApplication对象是应用程序的象征,一个UIApplication对象就代表一个应用程序. (2)每一个应用都有自己的UIApplica ...
- Scala学习笔记--正则表达式基础知识、如何在scala内使用
正则表达式语法:https://msdn.microsoft.com/zh-cn/library/ae5bf541(VS.80).aspx 基础知识:正则表达式30分钟入门教程 http://www. ...
- easyui 实现Tooltip
$('#btnAddr').tooltip({ content: $('<div class="table"></div>'), //弹出收件地址 show ...
- Codeforces Round #276 (Div. 2) 解题报告
题目地址:http://codeforces.com/contest/485 A题.Factory 模拟.判断是否出现循环,如果出现,肯定不可能. 代码: #include<cstdio> ...