iOS实现左右拖动抽屉效果

本文实例介绍了iOS实现左右拖动抽屉效果,具体内容如下

利用了触摸事件滑动 touchesMoved: 来触发左右视图的出现和消失 利用loadView方法中添加view 在self.view载入前就把 左右中View都设置好frame 每一个方法都由单独的功能。

#import "DarwViewController.h"
@interface DarwViewController ()
@property (nonatomic, weak) UIView *leftView;
@property (nonatomic, weak) UIView *rightView;
@property (nonatomic, weak) UIView *mainView;
/**
 * 动画是否进行
 */
@property (nonatomic ,assign) BOOL animating;

@end

@implementation DarwViewController
- (void)viewDidLoad {
  [super viewDidLoad];
}

-(void)loadView
{
  self.view = [[UIView alloc]initWithFrame:[UIScreen mainScreen].bounds];
  //左边view
  UIView *leftView = [[UIView alloc]initWithFrame:self.view.frame];
  [self.view addSubview:leftView];
  leftView.backgroundColor= [UIColor redColor];
  self.leftView = leftView;

  //右边View
  UIView *rightView = [[UIView alloc]initWithFrame:self.view.frame];
  [self.view addSubview:rightView];
  rightView.backgroundColor= [UIColor blueColor];
  self.rightView = rightView;

  //主页面
  UIView *mainView = [[UIView alloc]initWithFrame:self.view.frame];
  [self.view addSubview:mainView];
  mainView.backgroundColor= [UIColor yellowColor];
  self.mainView = mainView;

  //KVO监听
  [self.mainView addObserver:self forKeyPath:@"frame" options:NSKeyValueObservingOptionNew context:nil];
}
/**
 * KVO回调方法 当mainView Frame值改变时触发
 *
 * @param keyPath <#keyPath description#>
 * @param object <#object description#>
 * @param change <#change description#>
 * @param context <#context description#>
 */
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context
{
  if (self.animating) return; //如果mainView正在动画 就不执行
  if (self.mainView.frame.origin.x > 0 )
  {
    //X > 0 就隐藏右边View 显示左边View
    self.rightView.hidden = YES;
    self.leftView.hidden = NO;
  }
  else if (self.mainView.frame.origin.x < 0)
  {
    //X < 0 就隐藏左边View 显示右边VIew
    self.leftView.hidden = YES;
    self.rightView.hidden = NO;
  }
}
#pragma mark -- 触摸事件
-(void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
  //获得触摸对象
  UITouch *touch = [touches anyObject];

  //获得当前触摸点
  CGPoint currentPoint = [touch locationInView:self.view];
  //获得上一个触摸点
  CGPoint previousPoint = [touch previousLocationInView:self.view];

  //计算x方向的偏移量
  CGFloat offsetX = currentPoint.x - previousPoint.x;
//  根据x的偏移量计算y的偏移量
  self.mainView.frame = [self rectWithOffsetX:offsetX];

}
#define screenW [UIScreen mainScreen].bounds.size.width
#define screenH [UIScreen mainScreen].bounds.size.height
/**
 * 计算主视图的frame
 *
 * @param offsetX x的偏移量
 *
 * @return 偏移后新的frame
 */
- (CGRect ) rectWithOffsetX:(CGFloat )offsetX
{
  //Y轴的偏移量
  CGFloat offsetY = (screenH *1/5) * (offsetX/screenW);

  //比例 :(用于宽高的缩放)
  CGFloat scale = (screenH - offsetY *2) / screenH;
  if (self.mainView.frame.origin.x < 0 )
  {
    //如果x是负数 及左边View要显示
    //比例就要设为比1小
    scale = 2 - scale;
  }
  //获取当前mainView的frame
  CGRect frame = self.mainView.frame;

  //重新设置mainView的frame值
  frame.size.width = frame.size.width *scale >screenW ? screenW : frame.size.width *scale;

  frame.size.height = frame.size.height *scale >screenH ? screenH :frame.size.height *scale;

  frame.origin.x += offsetX;
  frame.origin.y =(screenH - frame.size.height)*0.5;
  //返回偏移后新的frame
  return frame;
}
#define maxRightX (screenW *0.8)
#define maxLeftX (-screenW *0.6)
-(void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
  CGFloat targetX = 0;
  //如果松手的那一下 当前mainVIew的x大于屏幕的一半
  if (self.mainView.frame.origin.x > screenW * 0.5)
  {
    //向右边定位
    targetX = maxRightX;
  }
  //如果松手的那一下 当前mainVIew的最大X值小于屏幕的一半
  else if (CGRectGetMaxX(self.mainView.frame) < screenW *0.5)
  {
    //向左边定位
    targetX = maxLeftX;
  }

  //计算偏移量
  CGFloat offsetX = targetX -self.mainView.frame.origin.x;

  self.animating = YES;

  [UIView animateWithDuration:0.4 animations:^{
    if (targetX == 0)
    {
      //如果targetX==0 复位
      self.mainView.frame = self.view.frame;
    }
    else
    {
      //如果targetX != 0 那就到指定位置
      self.mainView.frame = [self rectWithOffsetX:offsetX];
    }
  } completion:^(BOOL finished) {
    self.animating = NO;
  }];

}
@end

以上就是本文的全部内容,希望对大家的学习有所帮助。

(0)

相关推荐

  • IOS手势操作(拖动、捏合、旋转、点按、长按、轻扫、自定义)

    下面通过图文并茂的方式给大家分享下IOS手势操作(拖动.捏合.旋转.点按.长按.轻扫.自定义)的相关内容. 1.UIGestureRecognizer 介绍 手势识别在 iOS 中非常重要,他极大地提高了移动设备的使用便捷性. iOS 系统在 3.2 以后,他提供了一些常用的手势(UIGestureRecognizer 的子类),开发者可以直接使用他们进行手势操作. UIPanGestureRecognizer(拖动) UIPinchGestureRecognizer(捏合) UIRotatio

  • iOS手势识别的详细使用方法(拖动,缩放,旋转,点击,手势依赖,自定义手势)

    手势识别在iOS上非常重要,手势操作移动设备的重要特征,极大的增加了移动设备使用便捷性. 1.UIGestureRecognizer介绍 手势识别在iOS上非常重要,手势操作移动设备的重要特征,极大的增加了移动设备使用便捷性. iOS系统在3.2以后,为方便开发这使用一些常用的手势,提供了UIGestureRecognizer类.手势识别UIGestureRecognizer类是个抽象类,下面的子类是具体的手势,开发这可以直接使用这些手势识别. UITapGestureRecognizer UI

  • iOS应用中使用Auto Layout实现自定义cell及拖动回弹

    自定义 cell 并使用 Auto Layout 创建文件 我们可以一次性创建 xib 文件和类的代码文件. 新建 Cocoa Touch Class: 设置和下图相同即可: 检查成果 分别选中上图中的 1.2 两处,检查 3 处是否已经自动绑定为 firstTableViewCell,如果没有绑定,请先检查选中的元素确实是 2,然后手动绑定即可. 完成绑定工作 切换一页,如下图进行 Identifier 设置: 新建 Table View Controller 页面 新建一个 Table Vi

  • iOS UITableView 拖动排序实现代码

    UITbableView作为列表展示信息,除了展示的功能,有时还会用到删除,排序等功能,下面就来讲解一下如何实现排序. 排序是当表格进入编辑状态后,在单元格的右侧会出现一个按钮,点击按钮,就可以拖动单元格,移动位置,进行手动排序. 使用系统自带拖动排序功能的步骤: 1.让tableView进入编辑状态,也就是设置它的editing为YES 2.返回编辑模式,也就是实现UITableViewDelegate中的tableview:editingStyleForRowAtIndexPath:方法,在

  • IOS 七种手势操作(拖动、捏合、旋转、点按、长按、轻扫、自定义)详解及实例代码

    IOS 七种手势操作 今天为大家介绍一下IOS 的七种手势,手势在开发中经常用到,所以就简单 通俗易懂的说下, 话不多说,直接看代码: 1.UIGestureRecognizer 介绍 手势识别在 iOS 中非常重要,他极大地提高了移动设备的使用便捷性. iOS 系统在 3.2 以后,他提供了一些常用的手势(UIGestureRecognizer 的子类),开发者可以直接使用他们进行手势操作. UIPanGestureRecognizer(拖动) UIPinchGestureRecognizer

  • iOS粒子路径移动效果 iOS实现QQ拖动效果

    粒子效果,QQ拖动效果,实现很简单,具体代码如下 一.图示 二.分析 我们要实现的如果如上面的图示,那么我们可以按照下面的步骤操作: 第一步:我们的红点其实是一个UIButton.创建一个BageValueView继承自UIButton 第二步:初始化的时候,初始化控件,设置圆角,修改背景.文字颜色 第三步:添加手势.在手势的处理中我们,我们需要让当前控件随着手指移动而移动. 第四步:控件一开始创建的时候,其实有两个圆,一个就是我们能够拖动的大圆,另外一个就是原始位置上会改变大小的圆.这一步骤中

  • 举例讲解iOS开发中拖动视图的实现

    预备知识 iOS处理屏幕上的触摸动作,主要涉及到以下几个方法: 复制代码 代码如下: touchesBegan:withEvent:          //触摸屏幕的最开始被调用 touchesMoved:withEvent:         //移动过程中被调用 touchesEnded:withEvent:         //动作结束时被调用 touchesCancelled:WithEvent: 从方法的命名可以清晰的看出该方法何时被调用,最后一个比较特殊.touchesCancelle

  • 使用iOS控件UICollectionView生成可拖动的桌面的实例

    一个App受欢迎的程度,一方面来源于它本身为用户提供便捷的功能,另一方面则来源于它的UI.UI是用户体验重要的组成部分,构成UI的的元素恰恰离不开那些看似独立的控件.在开发的过程中,大家对UITableView应该很熟悉吧!确实UITableView在处理数据显示方面有着很强大的功能,例如网红们使用的微博,微信社交软件的聊天界面等等,这种流式布局使用UITableView简直最合适不过了:但毕竟UITableView不是万能的,当需要显示横纵向的数据时它就显得捉襟见肘了,虽然这也难不倒我们程序猿

  • iOS实现左右拖动抽屉效果

    本文实例介绍了iOS实现左右拖动抽屉效果,具体内容如下 利用了触摸事件滑动 touchesMoved: 来触发左右视图的出现和消失 利用loadView方法中添加view 在self.view载入前就把 左右中View都设置好frame 每一个方法都由单独的功能. #import "DarwViewController.h" @interface DarwViewController () @property (nonatomic, weak) UIView *leftView; @p

  • iOS实现简易的抽屉效果

    本文实例为大家分享了iOS实现简易的抽屉效果的具体代码,供大家参考,具体内容如下 1.添加需要实现抽屉效果的三个视图,这里需要注意主视图需要放在最后添加 // 左边视图  ... // 右边视图   ... // 主视图     UIView *mainView=[[UIView alloc]initWithFrame:self.view.bounds];     mainView.backgroundColor=[UIColor greenColor];     _mainView=mainV

  • iOS实现侧拉栏抽屉效果

    本文实例介绍了iOS实现侧拉栏抽屉效果的相关代码,分享给大家供大家参考,具体内容如下 需要导入第三方的类库如下: 抽屉效果所需第三方类库下载 效果:既可以两侧都实现抽屉效果也可只实现左侧栏或者右侧栏的抽屉效果 关于抽屉效果主要是AppDelegate的代码 AppDelegate.h文件代码: <span style="font-size:18px;"><span style="font-size:18px;">#import <UIK

  • iOS实现简单的抽屉效果

    说到抽屉效果在iOS中比较有名的第三方类库就是PPRevealSideViewController.一说到第三方类库就自然而然的想到我们的CocoaPods,本文用CocoaPods引入PPRevealSideViewController,然后在我们的工程中以代码结合storyboard来做出抽屉效果. 一.在工程中用CocoaPods引入第三方插件PPRevealSideViewController. (1).在终端中搜索PPRevealSideViewController的版本 (2).在P

  • IOS中MMDrawerController第三方抽屉效果的基本使用示例

    因为刚开年,所以最近公司比较闲,看到以前并不是我接手的项目中有这种抽屉效果的控制器,比较感兴趣,便对MMDrawerController研究起来.也方便自己忘记之后查阅,另外也希望对大家有所帮助(PS:以前都是上面一个导航栏,下面一个tabbar的项目居多,所以对这种抽屉控制器不是很了解). 1.首先,到GitHub上把MMDrawerController下下来,然后倒入到项目中.当然你用cocoapods倒入也行.看你心情呗O(∩_∩)O 2.接下来就在appdelegate中撸我们的代码了.

  • iOS实现抽屉效果

    本文实例为大家分享了iOS实现抽屉效果的具体代码,供大家参考,具体内容如下 抽屉效果: #import "DragerViewController.h" #define screenW [UIScreen mainScreen].bounds.size.width @interface DragerViewController () @property (nonatomic, weak) UIView *leftV; @property (nonatomic, weak) UIView

  • IOS实现点击滑动抽屉效果

    最近,看到好多Android上的抽屉效果,也忍不住想要自己写一个.在Android里面可以用SlidingDrawer,很方便的实现.IOS上面就只有自己写了.其实原理很简单就是 UIView 的移动,和一些手势的操作. 效果图: // // DrawerView.h // DrawerDemo // // Created by Zhouhaifeng on 12-3-27. // Copyright (c) 2012年 CJLU. All rights reserved. // #import

  • iOS抽屉效果开发案例分享

    本文实例为大家分享了iOS抽屉效果开发实例,供大家参考,具体内容如下 在显示在窗口的控制器上添加三个view(如果只需要往一边滑动就只加2个view) 先声明三个view #import "ViewController.h" @interface ViewController () @property(nonatomic, weak) UIView *mainV; @property(nonatomic, weak) UIView *leftV; @property(nonatomic

  • iOS开发之路--仿网易抽屉效果

    最终效果图: MainStoryBoard示意图: BeyondViewController.h // // BeyondViewController.h // 19_抽屉效果_仿网易 // // Created by beyond on 14-8-1. // Copyright (c) 2014年 com.beyond. All rights reserved. // #import <UIKit/UIKit.h> #import "LeftTableViewControllerD

  • iOS实现简易抽屉效果、双边抽屉效果

    本文实例为大家分享了iOS实现抽屉效果的全部代码,供大家参考,具体内容如下 iOS实现简易抽屉效果,代码: @interface ViewController () { UIView* _leftView; } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from

随机推荐