左右侧滑原理与实现方式
2014-12-17 14:35
435 查看
左右侧滑的原理在于把左边的vc.view,右边的vc.view和主视图控制器的view加到同一个vc。view上去,为主视图控制器的view加上拖拽和单点手势,做相应的处理控制相应的试图的frame就可以了。好了,下面我们来自己试试。第一步:为容器视图控制器声明一个方法:
-(instancetype)initWithLeftCtrl:(UIViewController *)leftCtrl withMainCtrl:(UIViewController *)maiCtrl withRightCtrl:(UIViewController *)rightCtrl;
在。m文件中实现这个方法实现方式如下:
-(instancetype)initWithLeftCtrl:(UIViewController *)leftCtrl withMainCtrl:(UIViewController *)maiCtrl withRightCtrl:(UIViewController *)rightCtrl
{
self=[super initWithNibName:nil bundle:nil];
if(self){
_leftCtrl=leftCtrl;
_mainCtrl=maiCtrl;
_rightCtrl=rightCtrl;
_isMain=YES;
_panRecognizer=[[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(handpan:)];
_panRecognizer.maximumNumberOfTouches=1;
_tapRecognizer=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handTap:)];
[_mainCtrl.view addGestureRecognizer:_tapRecognizer];
[_mainCtrl.view addGestureRecognizer:_panRecognizer];
_leftCtrl.view.frame=CGRectMake(-WIDTH, 0, WIDTH, HEIGHT);
_rightCtrl.view.frame=CGRectMake(self.view.bounds.size.width+WIDTH,
0, WIDTH, HEIGHT);
[self.view addSubview:_leftCtrl.view];
[self.view addSubview:_mainCtrl.view];
[self.view addSubview:_rightCtrl.view];
}
return self;
}
第三步:实现拖拽手势和单点手势的方法:
-(void)handpan:(UIPanGestureRecognizer *)pan
{
CGPoint
point=[pan
translationInView:_mainCtrl.view];
if(_isMain){
//point.x>0表示右滑,显示左视图
if(point.x>0){
[self showLeftCtrl];
}else{
[self showRightCtrl];
}
}
}
-(void)handTap:(UITapGestureRecognizer *)tap
{
//单点主视图的view显示主视图
[self
showMainCtrl];
}
showMainCtrl与showLeftCtrl与showRightCtrl方法实现如下:
-(void)showMainCtrl
{
_isMain=YES;
[UIView animateWithDuration:0.35
animations:^{
_leftCtrl.view.frame=CGRectMake(-WIDTH,
0,WIDTH, HEIGHT);
_mainCtrl.view.frame=CGRectMake(0,
0, self.view.bounds.size.width,
HEIGHT);
_rightCtrl.view.frame=CGRectMake(self.view.bounds.size.width+WIDTH,
0, WIDTH,
HEIGHT);
}];
}
-(void)showLeftCtrl
{
_isMain=NO;
[UIView animateWithDuration:0.35
animations:^{
_leftCtrl.view.frame=CGRectMake(0,
0,WIDTH, HEIGHT);
_mainCtrl.view.frame=CGRectMake(WIDTH,
0, self.view.bounds.size.width,
HEIGHT);
_rightCtrl.view.frame=CGRectMake(self.view.bounds.size.width+WIDTH+WIDTH,
0, WIDTH,
HEIGHT);
}];
}
-(void)showRightCtrl
{
_isMain=NO;
[UIView animateWithDuration:0.35
animations:^{
_rightCtrl.view.frame=CGRectMake(self.view.bounds.size.width-WIDTH,
0, WIDTH,
HEIGHT);
_leftCtrl.view.frame=CGRectMake(-WIDTH-WIDTH,
0,WIDTH, HEIGHT);
_mainCtrl.view.frame=CGRectMake(-WIDTH,
0, self.view.bounds.size.width,
HEIGHT);
}];
}
这里的_isMain表示是否显示的不是主视图,便于过滤不需要的效果
-(instancetype)initWithLeftCtrl:(UIViewController *)leftCtrl withMainCtrl:(UIViewController *)maiCtrl withRightCtrl:(UIViewController *)rightCtrl;
在。m文件中实现这个方法实现方式如下:
-(instancetype)initWithLeftCtrl:(UIViewController *)leftCtrl withMainCtrl:(UIViewController *)maiCtrl withRightCtrl:(UIViewController *)rightCtrl
{
self=[super initWithNibName:nil bundle:nil];
if(self){
_leftCtrl=leftCtrl;
_mainCtrl=maiCtrl;
_rightCtrl=rightCtrl;
_isMain=YES;
_panRecognizer=[[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(handpan:)];
_panRecognizer.maximumNumberOfTouches=1;
_tapRecognizer=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handTap:)];
[_mainCtrl.view addGestureRecognizer:_tapRecognizer];
[_mainCtrl.view addGestureRecognizer:_panRecognizer];
_leftCtrl.view.frame=CGRectMake(-WIDTH, 0, WIDTH, HEIGHT);
_rightCtrl.view.frame=CGRectMake(self.view.bounds.size.width+WIDTH,
0, WIDTH, HEIGHT);
[self.view addSubview:_leftCtrl.view];
[self.view addSubview:_mainCtrl.view];
[self.view addSubview:_rightCtrl.view];
}
return self;
}
第三步:实现拖拽手势和单点手势的方法:
-(void)handpan:(UIPanGestureRecognizer *)pan
{
CGPoint
point=[pan
translationInView:_mainCtrl.view];
if(_isMain){
//point.x>0表示右滑,显示左视图
if(point.x>0){
[self showLeftCtrl];
}else{
[self showRightCtrl];
}
}
}
-(void)handTap:(UITapGestureRecognizer *)tap
{
//单点主视图的view显示主视图
[self
showMainCtrl];
}
showMainCtrl与showLeftCtrl与showRightCtrl方法实现如下:
-(void)showMainCtrl
{
_isMain=YES;
[UIView animateWithDuration:0.35
animations:^{
_leftCtrl.view.frame=CGRectMake(-WIDTH,
0,WIDTH, HEIGHT);
_mainCtrl.view.frame=CGRectMake(0,
0, self.view.bounds.size.width,
HEIGHT);
_rightCtrl.view.frame=CGRectMake(self.view.bounds.size.width+WIDTH,
0, WIDTH,
HEIGHT);
}];
}
-(void)showLeftCtrl
{
_isMain=NO;
[UIView animateWithDuration:0.35
animations:^{
_leftCtrl.view.frame=CGRectMake(0,
0,WIDTH, HEIGHT);
_mainCtrl.view.frame=CGRectMake(WIDTH,
0, self.view.bounds.size.width,
HEIGHT);
_rightCtrl.view.frame=CGRectMake(self.view.bounds.size.width+WIDTH+WIDTH,
0, WIDTH,
HEIGHT);
}];
}
-(void)showRightCtrl
{
_isMain=NO;
[UIView animateWithDuration:0.35
animations:^{
_rightCtrl.view.frame=CGRectMake(self.view.bounds.size.width-WIDTH,
0, WIDTH,
HEIGHT);
_leftCtrl.view.frame=CGRectMake(-WIDTH-WIDTH,
0,WIDTH, HEIGHT);
_mainCtrl.view.frame=CGRectMake(-WIDTH,
0, self.view.bounds.size.width,
HEIGHT);
}];
}
这里的_isMain表示是否显示的不是主视图,便于过滤不需要的效果
相关文章推荐
- iOS 左右侧滑实现 UIView Block 方式 模仿网易左右侧滑效果
- google栅格map技术实现原理和用户体验方式
- jaas的原理及实现方式
- [Android学UI之三]实现新浪微博消息页面左右滑动页面方式二(二)
- 非主流RAID方式6/7/30/50/53/1.5实现原理及图解
- Spring AOP动态代理原理与实现方式
- Dr.COM防BT下载技术的原理和实现的方式
- 全排列算法原理和实现-----用递归方式实现
- Silverlight中,很多实例可以使用Xaml的方式进行配置实现的注意事项和原理
- (3) 利用 Setter方式实现 【第一种方式】 依赖注入,编码剖析Spring依赖注入的原理
- Tomcat集群Cluster实现原理剖析(session复制实现方式)
- (转)google栅格map技术实现原理和用户体验方式
- 最近在一个外网的网站,困扰了我多天的循环和大家分享下,也做为我以后工作之用.第一种(信息作用循环.实现方式后台时钟在前台循环滚动(左右)显示).
- 激活码方式注册的实现原理述
- [Android学UI之三]实现新浪微博消息页面左右滑动页面方式一(一)
- google栅格map技术实现原理和用户体验方式
- (Android实战)AsyncTask和Handler两种异步方式实现原理和优缺点比较
- 【Android应用开发】-(19)Android 串口编程原理和实现方式
- geohash算法原理及实现方式
- 【Android应用开发】-(19)Android 串口编程原理和实现方式(附源码)