iOS实现简易抽屉效果、双边抽屉效果
本文实例为大家分享了iOS实现抽屉效果的全部代码,供大家参考,具体内容如下
iOS实现简易抽屉效果,代码:
@interfaceViewController(){
UIView*_leftView;
}
@end
@implementationViewController
-(void)viewDidLoad{
[superviewDidLoad];
//Doanyadditionalsetupafterloadingtheview,typicallyfromanib.
_leftView=[[UIViewalloc]init];
//把左侧边的view先隐藏
_leftView.frame=CGRectMake(-200,0,200,self.view.frame.size.height);
_leftView.backgroundColor=[UIColorgreenColor];
[self.viewaddSubview:_leftView];
UIPanGestureRecognizer*pan=[[UIPanGestureRecognizeralloc]initWithTarget:selfaction:@selector(handlePan:)];
[self.viewaddGestureRecognizer:pan];
}
-(void)handlePan:(UIPanGestureRecognizer*)recognizer{
CGPointtranslation=[recognizertranslationInView:self.view];
//增量后的x坐标位置
CGFloatXresult=translation.x+_leftView.frame.origin.x;
//向右
if(translation.x>=0){
//leftView已全部拉出,则无法再向右
if(_leftView.frame.origin.x>=0||Xresult>=0){
_leftView.frame=CGRectMake(0,0,200,self.view.frame.size.height);
return;
}
}elseif(translation.x<0){//向左
//leftView已全部收回,则无法再向左
if(_leftView.frame.origin.x<=-200||Xresult<=-200){
_leftView.frame=CGRectMake(-200,0,200,self.view.frame.size.height);
return;
}
}
CGRectframe=_leftView.frame;
frame.origin.x+=translation.x;
_leftView.frame=frame;
//清空移动的距离,这是关键
[recognizersetTranslation:CGPointZeroinView:recognizer.view];
//做弹回效果,以中轴为界限
if(recognizer.state==UIGestureRecognizerStateEnded){
if(_leftView.frame.origin.x>-100){
[selfcloseView:NO];
}else{
[selfcloseView:YES];
}
}
}
-(void)closeView:(BOOL)close{
if(close){
[selfmoveView:CGRectMake(-200,0,200,self.view.frame.size.height)];
}else{
[selfmoveView:CGRectMake(0,0,200,self.view.frame.size.height)];
}
}
-(void)moveView:(CGRect)frame{
[UIViewanimateWithDuration:0.3animations:^{
_leftView.frame=frame;
}completion:^(BOOLfinished){
}];
}
iOS实现双边抽屉效果,代码:
#import"PathView.h"
#import"UIView+Additions.h"
@implementationPathView
-(instancetype)init{
self=[superinit];
if(self){
[selfsetupGestureRecognizer];
}
returnself;
}
-(void)setupGestureRecognizer{
UIPanGestureRecognizer*pan=[[UIPanGestureRecognizeralloc]initWithTarget:selfaction:@selector(handlePan:)];
[selfaddGestureRecognizer:pan];
}
-(void)handlePan:(UIPanGestureRecognizer*)recognizer{
CGPointtranslation=[recognizertranslationInView:self];
CGFloatXresult=translation.x+self.left;
if(translation.x>=0){//向右
if(self.left>=_leftWidth||Xresult>=_leftWidth){
self.frame=CGRectMake(_leftWidth,0,self.width,self.height);
return;
}
}
elseif(translation.x<0){//向左
if(self.left<=-_rightWidth||Xresult<=-_rightWidth){
self.frame=CGRectMake(-_rightWidth,0,self.width,self.height);
return;
}
}
self.left+=translation.x;
if(recognizer.state==UIGestureRecognizerStateEnded){
if(self.left>_leftWidth/2){
[selfopenLeft:YESopenRight:NO];
}
elseif(self.left<-(_rightWidth/2)){
[selfopenLeft:NOopenRight:YES];
}
else{
[selfopenLeft:NOopenRight:NO];
}
}
//清空移动的距离
[recognizersetTranslation:CGPointZeroinView:recognizer.view];
}
-(void)openLeft:(BOOL)leftopenRight:(BOOL)right{
if(!left&&!right){
[selfmoveView:CGRectMake(0,0,self.width,self.height)];
}elseif(!left&&right){
[selfmoveView:CGRectMake(-_rightWidth,0,self.width,self.height)];
}elseif(left&&!right){
[selfmoveView:CGRectMake(_leftWidth,0,self.width,self.height)];
}
}
-(void)moveView:(CGRect)frame{
[UIViewanimateWithDuration:0.3animations:^{
self.frame=frame;
}completion:^(BOOLfinished){
}];
}
上面是实现的具体内容,所以不做多少注释,只不过把手势移到view里面,让view自己改变自己的frame;再有就是添加了两个属性,来指定左右两边各自抽屉抽出的宽度,某一边不需要,只要设置为0就好了。
以上就是本文的全部内容,希望能够帮助大家顺利实现iOS抽屉效果。