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

// 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;
  }];

}
时间: 2024-10-06 00:15:24

第二十五篇、抽屉效果的核心代码的相关文章

Egret入门学习日记 --- 第二十五篇(书中 9.16~9.17 节 内容)

第二十五篇(书中 9.16~9.17 节 内容) 对于昨天的关于 List 组件使用的问题,我打算到书中提到List之后,再回头补充. 还有就是 Scroller 的 TileLayout 布局方式,也要去研究一下. 好了,开始按照书中内容一步一步走. 开始 9.16节. 重点: 1.设定TabBar皮肤. 2.设置TabBar布局. 操作: 1.设定TabBar皮肤. 第一步,准备素材! 第二步,创建 exml 文件! 第三步,拖入组件!约束大小! 第四步,增加两个状态 down 和 up.

第二十五篇 苦逼的人生该作何解释

今天我遇到了一些问题,这是一些生活中的情感问题,要是谁有好的方法,能不能为我指点一下迷津...... 原本今天的心情就像今天的天气一样,风和日丽,景色花香,日子还是过的很潇洒,又有小伙伴们一起娱乐.一起玩耍.但是下午突如其来的 一个电话 打破了这种和谐的景象,是什么电话呢,来自我爸手机上的一条短信,大概内容就是  要 确定是否为我的学费做出担保,其中的含义我就不多说了,反正一句话很简单------要钱,于是他马上打了一通电话给我,说这是什么情况:而我爸的脾气又火爆,我虽然性子特温顺,但是放到他身

第二十五篇:在SOUI中做事件分发处理

不同的SOUI控件可以产生不同的事件.SOUI系统中提供了两种事件处理方式:事件订阅 + 事件处理映射表(参见第八篇:SOUI中控件事件的响应) 事件订阅由于直接将事件及事件处理函数连接,不存在事件分发的问题,这里主要介绍使用事件映射表时的事件分发. 在回答这个问题前,首先了解一下什么是事件分发. 在大型项目中,程序逻辑可能非常复杂,如果将所有UI中控件的事件处理集中在一个消息/事件映射表里,代码的可维护性会变得非常差.解决这个问题常见的方法就是将事件进行分类(如根据来源分类),不同类别的事件采

第二十五篇 jQuery 学习7 获取并设置 CSS 类

jQuery 学习7 获取并设置 CSS 类 jQuery动态控制页面,那么什么是动态呢?我们就说一下静态,静态几乎又纯html+css完成,就是刷新页面之后,不会再出现什么变动,一个实打实的静态页面.那么动态,我们基于静态的特征说,动态:刷新页面之后,还可以发生样式改变等,就为动态. 这节课我们学习的是jQuery控制css,那么css样式都被改变了,算动态么?当然算啦,刷新页面之后发生了改变,就已经不是静态了,只要是变动了,就算是啦. 我们这节课学习四个控制css的方法: addClass(

python全栈开发基础【第二十五篇】死锁,递归锁,信号量,Event事件,线程Queue

一.死锁现象与递归锁 进程也是有死锁的 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用, 它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程, 如下就是死锁 #死锁现象 死锁------------------- from threading import Thread,Lock,RLock import time mutexA = Lock() mutexB = Lock() class

小刘同学的第二十五篇博文

...昨天立的flag,第一天就没有坚持... 8点钟开始写的,写到9点半,差不多完工了,还是只写了一题,哎,这个效率啊-- 最可怕的是自己打代码的时候还没有意识到,醉了 凸(艹皿艹 ) 完成了作业二,只能说是完成了,感觉还有很多很多的细节问题,而且还可以再优化一下. 决定还是把代码贴出来吧,这样大家能更方便看一下. 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset=&q

第二十五篇 -- C++宝典中的图书管理系统

此篇文章是基于C++宝典写的图书管理系统,本人对其中的部分做了相应修改,并且以现有格式替代原有格式,使程序更加清晰明了.此程序运行在VS2017上. 系统设计 图书管理系统分为四个模块:图书管理模块.读者管理模块.借书模块和还书模块. 总体设计 图书管理:对图书基本信息进行维护,主要包括新增图书.更改图书基本信息.删除图书.查找图书等功能模块. 读者管理:对读者的基本信息进行维护,主要包括增加读者.删除读者信息.查找特定读者等功能模块. 借书:进行图书借阅操作,该部分是整个图书管理系统中最主要的

第二十五篇:QQ聊天界面

UIImage: >1.对于一张图片拉伸方法: 1.1.得先拿到一张图片img; 1.2.再跟据img的size 分出四根线(top,left,bottom,right)大小,那么四周的图片不会被拉伸,中间的会被拉伸. 1.3.调用以下的方法,参数:UIEdgeInsetsMake(top,left,bottom,right):  UIImageResizingModeTile - (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets) - (

mysql 第二十五篇文章~相关分片功能的测试五

一 简介:今天咱们来进行测试 二分片规则 sharding-by-murmur 1 table 相关配置  <tableRule name="sharding-by-murmur"> <rule> <columns>id</columns> <algorithm>murmur</algorithm> </rule> </tableRule> 2 function 相关配置 <funct