iOS简易抽屉效果

2021-10-29 11:46:00 浏览数 (1)

直接在controller里面加代码实现的抽屉效果

代码语言:javascript复制
@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) {
}];
}</pre> 

0 人点赞