前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS简易抽屉效果

iOS简易抽屉效果

原创
作者头像
用户8671053
修改2021-10-29 11:46:00
8640
修改2021-10-29 11:46:00
举报
文章被收录于专栏:码农的生活

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档