IT虾米网

iOS简易抽屉效果详解

flyfish 2018年06月23日 手机开发 388 0
直接在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) { 
          
    }]; 
}

发布评论

分享到:

IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

iOS7使用原生API进行二维码和条形码的扫描详解
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。