简单的拖动手势控制侧拉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 的计算机科学与人工智能实 ...
随机推荐
- C# Serializable学习
先上代码,感觉这个功能很给力啊. class Program { static void Main(string[] args) { //下面代码将对象Person进行序列化并存储到一个文件中 Per ...
- js的水仙花数的输出
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- c#中serialPort1_DataReceived串口接收事件处理
1.缓冲区不定字节读取(波特率很高也没问题) //Thread.sleep(1000);//处理事件这块可以加上延时确保不定数的数据可以全部收到缓冲后,才去读缓冲内容--单位:毫秒 byte[] da ...
- Oracle 10g体系结构及安全管理
(1) Oracle数据库服务器:数据库,实例 (2) 数据库:(1)物理存储—数据文件,控制文件,日志文件,(2)逻辑存储—表空间,段,区间, ...
- Linux下安装memcached图文版
所用到的工具: putty小软件 可以远程连接主机的小软件 然后在屏幕上输入用户名root 密码:******即可连接 由于安装这两个工具需要编译所以:第一步要进行安装编译: 习惯于将下载 ...
- $(function(){})与(function($){....})(jQuery)的区别
$(function(){}); 全写为 $(docunemt).ready(function(){ }); 意义为在DOM加载完毕后执行ready()方法 (function($){....})(j ...
- BIT_COUNT()和BIT_OR()
在学习MySQL手册时,看到根据天数计算访问量时,出现了BIT_COUNT()和BIT_OR()两个函数来处理天数计算的问题 所使用的表格信息如下: mysql> select year,mon ...
- C++ crash 堆栈信息获取(三篇文章)
最近在做程序异常时堆栈信息获取相关工作,上一篇文章成功的在程序creash时写下了dump文件,而有些情况写dump文件是 不可以的,比如在jni开发时,C++只做底层处理,而整个项目是android ...
- cygwin安装与使用
cygwin安装很简单,下载运行setup.exe程序,一步一步就可以了. 具体安装细节参考:http://www.33lc.com/article/7276.html 安装完成后有如下问题: 在cm ...
- Net-Snmp安装配置
1. 下载安装 net-snmp安装程序:net-snmp-5.4.2.1-1.win32.exe Perl安装程序:ActivePerl-5.10.0.1004-MSWin32-x86-287188 ...