iOS开发之有趣的UI —— 抽屉特效
2015-09-22 23:42
603 查看
C语言学习:iOS开发分分钟搞定C语言
OC语言学习:iOS开发核心语言Objective C
无偿分享400G iOS学习资料。
获取途径:新浪微博 关注➕私信极客James
简单抽屉效果实现:
主要功能:
向左向右拖动图片显示不同的视图,当向右拖动大于屏幕一半时,视图停留在右边,当视图拖动小于屏幕一半时,返回原位置,当停靠在左右边时,点击任意视图会恢复位置.
实现核心思路:
本项目需要通过UI的手势识别来完成。
拖动视图需要用到UIPanGestureRecognizer 滑动手势和UITapGestureRecognizer 点按手势。
滑动图片的时候需要通过偏移量等来确定位置。
最终效果图:
项目实现步骤:
抽屉效果实现:
主要用到的知识点:
1.手势识别 拖动手势 点按手势
2.通过偏移量来计算视图移动的位置
实现步骤:
1.先声明和定义三个UIView属性 mainV LeftV RightV
2.在viewDidLoad中定义主视图mainV的拖动手势
添加滑动手势
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer
alloc]initWithTarget:self action:@selector(pan:)];
[_mainV addGestureRecognizer:pan];
添加点按手势:
UITapGestureRecognizer *tap = [[UITapGestureRecognizer
alloc]initWithTarget:self action:@selector(tap)];
[self.view addGestureRecognizer:tap];
3.判断显示左视图还是右视图
通过main.x 的值 大于零 显示左视图
小于零 显示右视图
4.拖动手势识别方法中 pan: 方法的实现
点按手势识别方法中 tap方法的的实现
(1)先获取mainV中x的偏移量
CGFloat offsetX = [pan translationInView:_mainV].x;
(2)修改mainV的frame值
self.mainV.frame = [self frameWithOffSet:offsetX];
(3)判断显示哪个视图
(4)判断手指离开的时候
if (pan.state == UIGestureRecongnizeStateEnded){
当frame.x > screen.width * 0.5 的时候定位到右边
当frame.x < screen.width * 0.5的时候 定位到左边
先算出屏幕的宽度
CGFloat scree = [UIScreen mainScreen].bounds.size.width;
定义一个target 为0
判断mainV的x值 大于一半还是小于一半
根据不同的判断给出相应的target值
}
(5)计算偏移量;
CGFloat offset = target - _mainV.frame.origin.x
(6)将偏移量赋值给mainV的frame上并加上动画
(7) 复位
[pan setTransLation:CGPointZero inView:_mainV];
(8) 判断显示哪个视图的 isShowLeftView方法的实现
通过_mainV的frame的origin的x值的正负来判断右边视图是否隐藏
(9)先给定一个偏移量,计算出新的偏移量方法实现
5.子视图的 setAllChildView 的封装
通过代码来实现:
OC语言学习:iOS开发核心语言Objective C
无偿分享400G iOS学习资料。
获取途径:新浪微博 关注➕私信极客James
简单抽屉效果实现:
主要功能:
向左向右拖动图片显示不同的视图,当向右拖动大于屏幕一半时,视图停留在右边,当视图拖动小于屏幕一半时,返回原位置,当停靠在左右边时,点击任意视图会恢复位置.
实现核心思路:
本项目需要通过UI的手势识别来完成。
拖动视图需要用到UIPanGestureRecognizer 滑动手势和UITapGestureRecognizer 点按手势。
滑动图片的时候需要通过偏移量等来确定位置。
最终效果图:
项目实现步骤:
抽屉效果实现:
主要用到的知识点:
1.手势识别 拖动手势 点按手势
2.通过偏移量来计算视图移动的位置
实现步骤:
1.先声明和定义三个UIView属性 mainV LeftV RightV
2.在viewDidLoad中定义主视图mainV的拖动手势
添加滑动手势
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer
alloc]initWithTarget:self action:@selector(pan:)];
[_mainV addGestureRecognizer:pan];
添加点按手势:
UITapGestureRecognizer *tap = [[UITapGestureRecognizer
alloc]initWithTarget:self action:@selector(tap)];
[self.view addGestureRecognizer:tap];
3.判断显示左视图还是右视图
通过main.x 的值 大于零 显示左视图
小于零 显示右视图
4.拖动手势识别方法中 pan: 方法的实现
点按手势识别方法中 tap方法的的实现
(1)先获取mainV中x的偏移量
CGFloat offsetX = [pan translationInView:_mainV].x;
(2)修改mainV的frame值
self.mainV.frame = [self frameWithOffSet:offsetX];
(3)判断显示哪个视图
(4)判断手指离开的时候
if (pan.state == UIGestureRecongnizeStateEnded){
当frame.x > screen.width * 0.5 的时候定位到右边
当frame.x < screen.width * 0.5的时候 定位到左边
先算出屏幕的宽度
CGFloat scree = [UIScreen mainScreen].bounds.size.width;
定义一个target 为0
判断mainV的x值 大于一半还是小于一半
根据不同的判断给出相应的target值
}
(5)计算偏移量;
CGFloat offset = target - _mainV.frame.origin.x
(6)将偏移量赋值给mainV的frame上并加上动画
(7) 复位
[pan setTransLation:CGPointZero inView:_mainV];
(8) 判断显示哪个视图的 isShowLeftView方法的实现
通过_mainV的frame的origin的x值的正负来判断右边视图是否隐藏
(9)先给定一个偏移量,计算出新的偏移量方法实现
// 伪代码 - (CGRect)frameWithOffset:(CGFloat)offset{ 1.获取屏幕的宽度 2.获取屏幕的高度 3.定义一个frame值与_mainV的frame值相等 4. 求x值 : frame的origin的x值 + 偏移量 offset 5. 求y值:x的值乘以50除以屏幕的宽度 然后求绝对值 6. 求h值:屏幕的高度 减去 两倍的y值 7. 求w值: 因为向左右滑动要改变视图的宽度,为了等比例缩放,需要按照比例来算视图的宽度 高度比例 = 高度h 除以屏幕的高度 w等于 屏幕的宽度乘以高度的比例 8.返回一个CGRectMake值 9.返回frame }
5.子视图的 setAllChildView 的封装
通过代码来实现:
#import "ZJViewController.h" @interface ZJViewController () @property (nonatomic , weak)UIView *mainV; @property (nonatomic , weak)UIView *leftV; @property (nonatomic , weak)UIView *rightV; @end @implementation ZJViewController - (void)viewDidLoad { [super viewDidLoad]; // 添加所有的视图 [self setAllChileView]; // 开启滑动手势识别 UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(pan:)]; // 将手势识别赋给视图控制 [_mainV addGestureRecognizer:pan]; // 点按手势 UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tap)]; [self.view addGestureRecognizer:tap]; } // 手势响应方法pan:的实现 - (void)pan:(UIPanGestureRecognizer *)pan{ // 屏幕的高度 //CGFloat screenH = [UIScreen mainScreen].bounds.size.height; // 滑动手势中mainV中x的偏移量 CGFloat offsetX = [pan translationInView:_mainV].x; // 修改mainV中的frame值 self.mainV.frame = [self frameWithOffset:offsetX]; // 判断显示哪个视图 (三目运算) [self isShowLeftView]; // 离开手指时候做的判断 做定位和复位功能 if(pan.state == UIGestureRecognizerStateEnded){ // 屏幕的宽度 CGFloat screenW = [UIScreen mainScreen].bounds.size.width; CGFloat target = 0; if (_mainV.frame.origin.x > screenW * 0.5) { // 定位到右边 target = 300; } else if(CGRectGetMaxX(_mainV.frame) < screenW * 0.5){ // 定位到左边 target = -300; } // 计算偏移量 CGFloat offsetX = target - _mainV.frame.origin.x; // 增加动画 [UIView animateWithDuration:0.25 animations:^{ _mainV.frame = [self frameWithOffset:offsetX]; }]; } // 复位 [pan setTranslation:CGPointZero inView:_mainV]; } // 点按手势tap:的实现方法 - (void)tap{ if (_mainV.frame.origin.x != 0) { // 复位 [UIView animateWithDuration:0.25 animations:^{ _mainV.frame = self.view.bounds; }]; } } // 判断显示哪个视图 - (void)isShowLeftView{ if (_mainV.frame.origin.x > 0) { _rightV.hidden = YES; } else if (_mainV.frame.origin.x < 0){ _rightV.hidden = NO; } } // 通过给定的偏移量,计算出新的偏移量方法的封装 - (CGRect)frameWithOffset:(CGFloat)offset{ // 屏幕的高度 CGFloat screenH = [UIScreen mainScreen].bounds.size.height; // 屏幕的宽度 CGFloat screenW = [UIScreen mainScreen].bounds.size.width; // 定义一个frame值与_main的frame值相同 CGRect frame = _mainV.frame; CGFloat x = frame.origin.x + offset; CGFloat y = fabs(x * 50/screenW); CGFloat h = screenH - 2 * y; // 宽度的比例 CGFloat scare = h/screenH; CGFloat w = screenW * scare; return CGRectMake(x, y, w, h); return frame; } // 所有子视图的view - (void)setAllChileView{ // 左边视图 UIView *left = [[UIView alloc]initWithFrame:self.view.bounds]; left.backgroundColor = [UIColor yellowColor]; // 增加到视图上 [self.view addSubview:left]; // 视图赋值声明的属性 (相当于SB中的连线) _leftV = left; // 右边视图 UIView *right = [[UIView alloc]initWithFrame:self.view.bounds]; right.backgroundColor = [UIColor blueColor]; // 增加到视图上 [self.view addSubview:right]; _rightV = right; // 中间视图 UIView *main = [[UIView alloc]initWithFrame:self.view.bounds]; main.backgroundColor = [UIColor redColor]; // 增加到视图上 [self.view addSubview:main]; _mainV = main; } @end
相关文章推荐
- PHP 性能分析第二篇: Xhgui In-Depth
- PHP 性能分析第二篇: Xhgui In-Depth
- requestFeature() must be called before adding content
- iOS大典之UIView
- EasyUI datagrid 格式化显示数据
- DOTNET笔记_StringBuilder_List<T>_Array
- hdoj 5400 Arithmetic Sequence 【构造等差数列】
- UITableViewDataSource的代理方法
- UVA 540 Team Queue
- UITableViewDelegate的代理方法
- ZOJ 2587--Unique Attack【判断最小割是否唯一】
- UIColor的使用及拓展
- BindingExpression path using IMultiValueConverter in datacolumn
- JAVA问题总结之24--HashMap键值对(key-value)的操作
- iOS开发之UIActivityIndicatorView(二)
- UIButton的响应事件 UIControlEvents 类型说明
- Unix环境编程学习笔记-------通读APUE第一遍后的疑问???????
- systemUI之statusbar
- IOS学习之 UITabBar
- UIday2201:IOS开发中的多线程