简单的拖动手势控制侧拉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 的计算机科学与人工智能实 ...
随机推荐
- HEAP[xxx.exe]:Invalid Address specified to RtlValidateHeap 错误的解决方法总结
一.情况 抽象出问题是这样的: class DLL_API1 A { func() { vector vec; B b; b.func(vec); return TRUE; } } 其中B是另一个导出 ...
- Hibernate配置文件中映射元素详解
对象标识符号 在关系数据库表中,主键(Primary Key)用来识别记录,并保证每条记录的唯一性.在Java语言中,通过比较两个变量所引用对象的内存地址是否相同,或者比较两个变量引用的对象值是否相同 ...
- 使用json常用到的包有以下六个
使用json常用到的包有以下六个 1. commons-logging-1.0.4.jar 2. commons-lang-2.3.jar 3. commons-collections-3.2.jar ...
- hadoop中datanode无法启动
一.问题描述 当我多次格式化文件系统时,如 [hadoop@xsh hadoop]$ ./bin/hdfs namenode -format 会出现datanode无法启动,查看日志(/usr/loc ...
- javascript获取host
document.writeln(location.protocol); document.writeln(location.origin); //包括端口号 document.writeln(loc ...
- iPhone 和Android应用,特殊的链接:打电话,短信,email;
http://ice-k.iteye.com/blog/1426526 下面的这篇文章主要是说,网页中的链接如何写,可以激活电话的功能. 例如,页面中展示的是一个电话号码,当用户在手机浏览器里面点击这 ...
- MySQL表复制
http://www.2cto.com/database/201202/120259.html http://www.cnblogs.com/sunss/archive/2010/10/08/1845 ...
- XML Schema <第三篇>
验证XML文档是否符合议定的XML结构有两种方法,分别是DTD模式与XML Schema.本文主要介绍XML Schema. 一.XML Schema的优点 XML Schema基于XML,没有专门的 ...
- 操作系统对的IIS版本
IIS版本 Windows版本 备注 IIS 1.0 Windows NT 3.51 Service Pack 3 IIS 2.0 Windows NT 4.0 IIS 3.0 Windows ...
- Android Listview异步动态加载网络图片
1.定义类MapListImageAndText管理ListViewItem中控件的内容 package com.google.zxing.client.android.AsyncLoadImage; ...