iOS简易抽屉效果详解手机开发

直接在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

(0)
上一篇 2021年7月16日
下一篇 2021年7月16日

相关推荐

发表回复

登录后才能评论