首页 > 代码库 > 第二十五篇、抽屉效果的核心代码

第二十五篇、抽屉效果的核心代码

// pan 拽 手势处理- (IBAction)panGesture:(UIPanGestureRecognizer *)sender{     // 如果是刚按下的状态,则记住,mainView的起始x  if (UIGestureRecognizerStateBegan == sender.state) {    _startX = self.mainView.frame.origin.x;  }        // 平移拖动的距离  CGPoint delta = [sender translationInView:_mainView];     CGRect frame = self.mainView.frame;     // 计算新的x值,并做健壮性判断  kEndX = _startX + delta.x;     // 1,限制最大拖动范围     if (kEndX >= kLeftWidth) {    kEndX = kLeftWidth;  }  if (kEndX <= - kRightWidth) {    kEndX = - kRightWidth;  }  // 2,由于 左view和右view在重叠,所以要隐藏其中的一个  if (kEndX > 0) {    // NSLog(@"--调用频率相当高--");    _rightView.hidden = YES;    _leftView.hidden = NO;  } else {    _rightView.hidden = NO;    _leftView.hidden = YES;  }        if (UIGestureRecognizerStateEnded == sender.state) {         // 手势结束的时候,需进行robust判断         // 2,分析end松手时候,的位置x,决定展开到什么程度/*    // 2.1 如果只向右拖了一点点,小于 1/2 的左view的宽度,则归0    if (kEndX < 0.5*kLeftWidth && kEndX >= 0) {      kEndX = 0;    }else if (kEndX >= 0.5*kLeftWidth && kEndX <= kLeftWidth) {      // 2.2 如果向右拖一大半了,大于 1/2 的左view的宽度,虽然还没到位,也可以认为是到位了      kEndX = kLeftWidth;    }else if (kEndX > - 0.5*kRightWidth && kEndX <= 0) {      // 2.3 如果只向左拖了一点点,小于 1/2 的右view的宽度,则归0      kEndX = 0;    }else if (kEndX <= - 0.5*kRightWidth) {      // 2.4 如果向左拖一大半了,大于 1/2 的右view的宽度,虽然还没到位,也可以认为是到位了      kEndX = - kRightWidth;    }*/              // 第2种判断方式    // 起始为0,delta.x大于0 代表向右滑动    if (_startX == 0 && delta.x >0) {      kEndX = kLeftWidth;    }else if (_startX == 0 && delta.x < 0){      // 起始为0,delta.x小于0 代表向左滑动      kEndX = - kRightWidth;    }else if (_startX == kLeftWidth && delta.x < 0){      // 起始为kLeftWidth,delta.x小于0 代表向左滑动      kEndX =0;    }else if (_startX == - kRightWidth && delta.x > 0){      // 起始为- kRightWidth,delta.x大于0 代表向右滑动      kEndX = 0;    }             }     // 最后,才设置mainView的新的frame  [UIView animateWithDuration:0.2 animations:^{        self.mainView.frame=frame;  }];           // 最后,为mainView所在的图层 添加阴影效果  [self addShadowFormainViewWithEndX:kEndX];   } // 自定义方法,为mainView所在的图层 添加阴影效果 (调用频率相当高)- (void)addShadowFormainViewWithEndX:(CGFloat)endX{  // 1,点击工程,加号,导入第3方框架 #import <QuartzCore/QuartzCore.h>     // 2,拿到mainView所在的图层,设置阴影 参数    // NSLog(@"调用频率很高---");  _mainView.layer.shadowColor = [UIColor blackColor].CGColor;  _mainView.layer.shadowOpacity = 0.5;  if (endX >= 0) {    _mainView.layer.shadowOffset = CGSizeMake(-5, 0);  } else {    _mainView.layer.shadowOffset = CGSizeMake(5, 0);  }   } // 单击按钮,也一样可以展开 左右侧边栏- (IBAction)btnClick:(UIButton *)sender{  // 定义一个临时变量  CGFloat startX = _mainView.frame.origin.x;        // 先为mainView所在的图层 添加阴影效果  [self addShadowFormainViewWithEndX:sender.tag == 1?1:-1];        // 定义一个临时变量  CGFloat tempEndX = 0;  // 左边的按钮被单击  if (1 == sender.tag) {    // 隐藏右半边    _leftView.hidden = NO;    _rightView.hidden = YES;         if (startX == 0) {      tempEndX = kLeftWidth;    }else if (startX == kLeftWidth){      tempEndX = 0;    }  } else {    // 单击右边按钮, 隐藏左半边    _leftView.hidden = YES;    _rightView.hidden = NO;    if (startX == 0) {      tempEndX = - kRightWidth;    }else if (startX == - kRightWidth){      tempEndX = 0;    }  }  // 最后才设置mainView的x,调用抽取出来的公共代码,设置mainView的x,参数是endX  [self setmainViewX:tempEndX];       }  // 抽取出来的公共代码,设置mainView的x,参数是endX- (void)setmainViewX:(CGFloat)endX{  CGRect frame = self.mainView.frame;  frame.origin.x = endX;  [UIView animateWithDuration:0.2 animations:^{    self.mainView.frame=frame;  }];   }

 

第二十五篇、抽屉效果的核心代码