直接在controller里面加代码实现的抽屉效果
@interface ViewController () { UIView* _leftView; } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. _leftView = [[UIView alloc] init]; //把左侧边的view先隐藏 _leftView.frame = CGRectMake(-200, 0, 200, self.view.frame.size.height); _leftView.backgroundColor = [UIColor greenColor]; [self.view addSubview:_leftView]; UIPanGestureRecognizer* pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)]; [self.view addGestureRecognizer:pan]; } - (void)handlePan:(UIPanGestureRecognizer*) recognizer { CGPoint translation = [recognizer translationInView:self.view]; //增量后的x坐标位置 CGFloat Xresult = 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; } } else if (translation.x < 0) {//向左 //leftView已全部收回,则无法再向左 if (_leftView.frame.origin.x <= -200 || Xresult <= -200) { _leftView.frame = CGRectMake(-200, 0, 200, self.view.frame.size.height); return; } } CGRect frame = _leftView.frame; frame.origin.x += translation.x; _leftView.frame = frame; //清空移动的距离,这是关键 [recognizer setTranslation:CGPointZero inView:recognizer.view]; //做弹回效果,以中轴为界限 if (recognizer.state == UIGestureRecognizerStateEnded) { if (_leftView.frame.origin.x > -100) { [self closeView:NO]; } else { [self closeView:YES]; } } } - (void)closeView:(BOOL)close { if (close) { [self moveView:CGRectMake(-200, 0, 200, self.view.frame.size.height)]; } else { [self moveView:CGRectMake(0, 0, 200, self.view.frame.size.height)]; } } - (void)moveView:(CGRect)frame { [UIView animateWithDuration:0.3 animations:^{ _leftView.frame = frame; } completion:^(BOOL finished) { }]; }
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/3281.html