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抽屉效果。