- @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) {
- }];
- }
来源: http://www.phpxs.com/code/1005639/