音效素材网提供各类素材,打造精品素材网站!

站内导航 站长工具 投稿中心 手机访问

音效素材

iOS抽屉效果开发案例分享
日期:2016-04-08 14:43:51   来源:脚本之家

本文实例为大家分享了iOS抽屉效果开发实例,供大家参考,具体内容如下

在显示在窗口的控制器上添加三个view(如果只需要往一边滑动就只加2个view)

先声明三个view

#import "ViewController.h"
 
@interface ViewController ()
@property(nonatomic, weak) UIView *mainV;
@property(nonatomic, weak) UIView *leftV;
@property(nonatomic, weak) UIView *rightV;
@end

添加view到控制器view上

#pragma mark - 添加子控件
- (void)setUpChildViews {  
 UIView *leftV = [[UIView alloc]initWithFrame:self.view.bounds];  
 leftV.backgroundColor = [UIColor orangeColor];  
 [self.view addSubview:leftV];  
 _leftV = leftV;  
 UIView *rightV = [[UIView alloc]initWithFrame:self.view.bounds];  
 rightV.backgroundColor = [UIColor groupTableViewBackgroundColor];  
 [self.view addSubview:rightV];  
 _rightV = rightV;  
 UIView *mainV = [[UIView alloc]initWithFrame:self.view.bounds];  
 mainV.backgroundColor = [UIColor yellowColor];  
 [self.view addSubview:mainV];  
 _mainV = mainV;
}
 
- (void)viewDidLoad {
 [super viewDidLoad];
  
 //添加子控件
 [self setUpChildViews];
  
 //添加Pan手势
 UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(pan:)];
  
 [self.view addGestureRecognizer:pan];
  
 //添加点按手势,在主视图上任意位置点击回到屏幕开始位置
 UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tap)];
  
 [self.view addGestureRecognizer:tap];
  
}
#pragma mark - 手势识别方法
#define targetL -230
#define targetR 200
#define screenW [UIScreen mainScreen].bounds.size.width
- (void)pan:(UIPanGestureRecognizer *)pan {
  
 //获取手势移动的位置
 CGPoint tranP = [pan translationInView:self.view];
  
 //获取x的偏移量
 CGFloat offsetX = tranP.x;
  
 //修改mainV的frame
 _mainV.frame = [self frameWithOffsetX:offsetX];
  
 //判断mainV的x是否大于0
 [self observeValueForKeyPath:nil ofObject:nil change:nil context:nil];
  
 //复位
 [pan setTranslation:CGPointZero inView:self.view];
  
 //判断当手势结束的时候,定位
 if (pan.state == UIGestureRecognizerStateEnded) {
   
  CGFloat target = 0;
   
  if (_mainV.frame.origin.x > screenW * 0.5) {
   //定位到右边
   target = targetR;
  }else if(CGRectGetMaxX(_mainV.frame) < screenW * 0.5) {
   //定位到左边
   target = targetL;
  }
   
  //获取X轴需要移动的偏移量
  CGFloat offsetX = target - _mainV.frame.origin.x;
   
  [UIView animateWithDuration:0.25 animations:^{
    
   _mainV.frame = target == 0 ? self.view.bounds : [self frameWithOffsetX:offsetX];
 
  }];
   
 }
  
}
- (void)tap {
  
 [UIView animateWithDuration:0.25 animations:^{
  _mainV.frame = self.view.bounds;
 }];
  
}

#define kMaxY 80
#pragma mark - 根据offsetX计算mainV的frame
- (CGRect)frameWithOffsetX:(CGFloat)offsetX {
  
 //获取上一次的frame
 CGRect frame = _mainV.frame;
  
 //获取屏幕的高度
 CGFloat screenH = [UIScreen mainScreen].bounds.size.height;
  
 //获取屏幕的宽度
 //CGFloat screenW = [UIScreen mainScreen].bounds.size.width;
  
 //X轴平移一点对应Y轴需要平移的距离
 CGFloat offsetY = offsetX * kMaxY / screenW;
  
 //获取上一次的高度
 CGFloat preH = frame.size.height;
  
 //获取上一次的宽度
 CGFloat preW = frame.size.width;
  
 //获取当前高度
 CGFloat curH = preH - 2 * offsetY;
 //如果是向左滑动
 if(frame.origin.x < 0) {
  curH = preH + 2 * offsetY;
 }
  
 //获取尺寸的缩放比例
 CGFloat scale = curH / preH;
  
 //获取当前宽度
 CGFloat curW = preW * scale;
  
 //获取当前x
 frame.origin.x += offsetX;
  
 //获取当前y
 CGFloat y = (screenH - curH) / 2;
 frame.origin.y = y;
  
 frame.size.width = curW;
 frame.size.height = curH;
  
 return frame;
  
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context {
  
 if(_mainV.frame.origin.x > 0) {//往右边滑动
  _rightV.hidden = YES;
 }else if(_mainV.frame.origin.x < 0) {//往左边滑动
  _rightV.hidden = NO;
 }
  
}

如果想要在mainV主视图中显示tableView,就新创建一个TableViewController,在这里面显示tableView的数据,

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
 
 return 30;
}
 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  
  
 static NSString *ID = @"cell";
  
 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
  
 if(cell == nil) {
  cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];
 }
  
 cell.textLabel.text = [NSString stringWithFormat:@"第%ld行", indexPath.row];
  
 return cell;
}

再创建一个在storyboard中显示的控制器XXMainViewController,继承自实现了抽屉效果的ViewController,并且在storyboard中将class改为这个控制的类名,还要将显示tableView的控制成为他的子控制器

- (void)viewDidLoad {
 [super viewDidLoad];
  
 XXViewController *vc = [[XXViewController alloc]init];
 vc.view.frame = self.view.bounds;
  
 //让vc成为主视图控制器的子控制器
 [self addChildViewController:vc];
  
 //主视图展示tableView
 [self.mainV addSubview:vc.view];
  
}

为了在XXMainViewController中只能访问mainV而不能修改他的值,所以将子控件的view暴露在ViewController.h中,并添加read-only

#import <UIKit/UIKit.h>
 
@interface ViewController : UIViewController
@property(nonatomic, weak, readonly) UIView *mainV;
@property(nonatomic, weak, readonly) UIView *leftV;
@property(nonatomic, weak, readonly) UIView *rightV;
@end

运行效果图:

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

    您感兴趣的教程

    在docker中安装mysql详解

    本篇文章主要介绍了在docker中安装mysql详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编...

    详解 安装 docker mysql

    win10中文输入法仅在桌面显示怎么办?

    win10中文输入法仅在桌面显示怎么办?

    win10系统使用搜狗,QQ输入法只有在显示桌面的时候才出来,在使用其他程序输入框里面却只能输入字母数字,win10中...

    win10 中文输入法

    一分钟掌握linux系统目录结构

    这篇文章主要介绍了linux系统目录结构,通过结构图和多张表格了解linux系统目录结构,感兴趣的小伙伴们可以参考一...

    结构 目录 系统 linux

    PHP程序员玩转Linux系列 Linux和Windows安装

    这篇文章主要为大家详细介绍了PHP程序员玩转Linux系列文章,Linux和Windows安装nginx教程,具有一定的参考价值,感兴趣...

    玩转 程序员 安装 系列 PHP

    win10怎么安装杜比音效Doby V4.1 win10安装杜

    第四代杜比®家庭影院®技术包含了一整套协同工作的技术,让PC 发出清晰的环绕声同时第四代杜比家庭影院技术...

    win10杜比音效

    纯CSS实现iOS风格打开关闭选择框功能

    这篇文章主要介绍了纯CSS实现iOS风格打开关闭选择框,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作...

    css ios c

    Win7如何给C盘扩容 Win7系统电脑C盘扩容的办法

    Win7如何给C盘扩容 Win7系统电脑C盘扩容的

    Win7给电脑C盘扩容的办法大家知道吗?当系统分区C盘空间不足时,就需要给它扩容了,如果不管,C盘没有足够的空间...

    Win7 C盘 扩容

    百度推广竞品词的投放策略

    SEM是基于关键词搜索的营销活动。作为推广人员,我们所做的工作,就是打理成千上万的关键词,关注它们的质量度...

    百度推广 竞品词

    Visual Studio Code(vscode) git的使用教程

    这篇文章主要介绍了详解Visual Studio Code(vscode) git的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。...

    教程 Studio Visual Code git

    七牛云储存创始人分享七牛的创立故事与

    这篇文章主要介绍了七牛云储存创始人分享七牛的创立故事与对Go语言的应用,七牛选用Go语言这门新兴的编程语言进行...

    七牛 Go语言

    Win10预览版Mobile 10547即将发布 9月19日上午

    微软副总裁Gabriel Aul的Twitter透露了 Win10 Mobile预览版10536即将发布,他表示该版本已进入内部慢速版阶段,发布时间目...

    Win10 预览版

    HTML标签meta总结,HTML5 head meta 属性整理

    移动前端开发中添加一些webkit专属的HTML5头部标签,帮助浏览器更好解析HTML代码,更好地将移动web前端页面表现出来...

    移动端html5模拟长按事件的实现方法

    这篇文章主要介绍了移动端html5模拟长按事件的实现方法的相关资料,小编觉得挺不错的,现在分享给大家,也给大家...

    移动端 html5 长按

    HTML常用meta大全(推荐)

    这篇文章主要介绍了HTML常用meta大全(推荐),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参...

    cdr怎么把图片转换成位图? cdr图片转换为位图的教程

    cdr怎么把图片转换成位图? cdr图片转换为

    cdr怎么把图片转换成位图?cdr中插入的图片想要转换成位图,该怎么转换呢?下面我们就来看看cdr图片转换为位图的...

    cdr 图片 位图

    win10系统怎么录屏?win10系统自带录屏详细教程

    win10系统怎么录屏?win10系统自带录屏详细

    当我们是使用win10系统的时候,想要录制电脑上的画面,这时候有人会想到下个第三方软件,其实可以用电脑上的自带...

    win10 系统自带录屏 详细教程

    + 更多教程 +
    Windows系统Linux系统苹果MACAndroidiOS系统鸿蒙系统