简单的iOS抽屉效果
#define screenW [UIScreen mainScreen].bounds.size.width
#import "ViewController.h"
@interface ViewController ()
@property (nonatomic,strong)UIView * redView;
@property (nonatomic,strong)UIView *yellowView;
@property (nonatomic,strong)UIView *greenView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self setUpView];
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(pan:)];
[self.view addGestureRecognizer:pan];
}
//根据当前最前面视图的frame确定是否隐藏第二个View
- (void)Hidden{
if (self.greenView.frame.origin.x>0) {//往右移动,显示黄色的View
self.yellowView.hidden = NO;
}else if (self.greenView.frame.origin.x<0){//往左移动,隐藏黄色的View
self.yellowView.hidden = YES;
}
}
#define rightLocation 275
#define leftLocation -250
#pragma mark pan的方法
- (void)pan:(UIPanGestureRecognizer *)pan{
//获取手势移动的位置
CGPoint point = [pan translationInView:self.view];
//获取X轴的偏移量
CGFloat offSetX = point.x;
//修改greenView的frame
self.greenView.frame = [self changeFrameWith:offSetX];
//判断greenViewdex是否大于0
[self Hidden];
//复位
[pan setTranslation:CGPointZero inView:self.view];
//判断下当手势结束的时候,定位
if (pan.state == UIGestureRecognizerStateEnded) {
CGFloat target = 0;
if (self.greenView.frame.origin.x > screenW * 0.5) {
target = rightLocation;
}else if (CGRectGetMaxX(self.greenView.frame)<screenW * 0.5){
target = leftLocation;
}
//获取偏移量
CGFloat offSetX = target-self.greenView.frame.origin.x;
[UIView animateWithDuration:0.25 animations:^{
self.greenView.frame = target == 0?self.view.bounds:[self changeFrameWith:offSetX];
}];
}
}
#define MaxY 100
//根据偏移量获取一个新的frame
#pragma mark - 根据offSetX计算greenView的frame
- (CGRect)changeFrameWith:(CGFloat)offSetX{
//获取上一次的frame
CGRect frame = self.greenView.frame;
//获取上一次的高和宽
CGFloat oldW = frame.size.width;
CGFloat oldH = frame.size.height;
//移动后的x
CGFloat curX =frame.origin.x + offSetX;
//y轴方向偏移量
CGFloat offsetY = offSetX*MaxY/screenW;
//当前的frame高度
CGFloat curH = frame.size.height - 2*offsetY;
if (frame.origin.x<0) {//往左移动
curH = oldH+2*offsetY;
}
//获取尺寸的缩放比例
CGFloat scale = curH/oldH;
CGFloat curW = oldW * scale;
CGFloat curY = (self.view.frame.size.height - curH)*0.5;
//更改frame
frame.origin.x = curX;
frame.origin.y = curY;
frame.size.width = curW;
frame.size.height = curH;
return frame;
}
#pragma mark 添加View
- (void)setUpView{
self.redView = [[UIView alloc]initWithFrame:self.view.frame];
self.redView.backgroundColor = [UIColor redColor];
[self.view addSubview:self.redView];
self.yellowView = [[UIView alloc]initWithFrame:self.view.frame];
self.yellowView.backgroundColor = [UIColor yellowColor];
[self.view addSubview:self.yellowView];
self.greenView = [[UIView alloc]initWithFrame:self.view.frame];
self.greenView.backgroundColor = [UIColor greenColor];
[self.view addSubview:self.greenView];
}
@end
简单的iOS抽屉效果的更多相关文章
- iOS开发——高级篇——iOS抽屉效果实现原理
实现一个简单的抽屉效果: 核心思想:KVO实现监听mainV的frame值的变化 核心代码: #import "ViewController.h" // @"frame& ...
- iOS抽屉效果
源代码下载 抽屉效果第三方类库下载 所需第三方类库下载 側拉栏抽屉效果图 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTUhUaW9z/font/5a6L ...
- AJ学IOS(26)UI之iOS抽屉效果小Demo
AJ分享,必须精品 先看效果 实现过程 第一步,把三个view设置好,还有颜色 #warning 第一步 - (void)addChildView { // left UIView *leftView ...
- ios开发中超简单抽屉效果(MMDrawerController)的实现
ios开发中,展示类应用通常要用到抽屉效果,由于项目需要,本人找到一个demo,缩减掉一些不常用的功能,整理出一个较短的实例. 首先需要给工程添加第三方类库 MMDrawerController: 这 ...
- iOS开发——实用技术OC篇&简单抽屉效果的实现
简单抽屉效果的实现 就目前大部分App来说基本上都有关于抽屉效果的实现,比如QQ/微信等.所以,今天我们就来简单的实现一下.当然如果你想你的效果更好或者是封装成一个到哪里都能用的工具类,那就还需要下一 ...
- iOS中 超简单抽屉效果(MMDrawerController)的实现
ios开发中,展示类应用通常要用到抽屉效果,由于项目需要,本人找到一个demo,缩减掉一些不常用的功能,整理出一个较短的实例. 首先需要给工程添加第三方类库 MMDrawerController: 这 ...
- 玩转iOS开发 - 简易的实现2种抽屉效果
BeautyDrawer BeautyDrawer 是一款简单易用的抽屉效果实现框架,集成的属性能够对view 滑动缩放进行控制. Main features 三个视图,主视图能够左右滑动.实现抽屉效 ...
- iOS开发之抽屉效果实现
说道抽屉效果在iOS中比较有名的第三方类库就是PPRevealSideViewController.一说到第三方类库就自然而然的想到我们的CocoaPods,今天的博客中用CocoaPods引入PPR ...
- 更好的抽屉效果(ios)
昨天项目基本没啥事了,晚上早早的就回家了,躺在床上无聊地玩着手机(Android的),在清理系统垃圾时被一个“360手机助手”给吸引了, 其实我是被它的那个抽屉效果给吸引了,此时你也许会觉得我out了 ...
随机推荐
- Mac环境下Myeclispe2015工具的安装与破解
链接地址:http://www.07net01.com/2015/08/919753.html 07net01.com 发布于 2015-08-30 22:19:37 分类:IT技术 阅读(306) ...
- Oracle Enterprise Manager 11g 输入用户名和口令 点击“登录”按键后没反应,也不报错,是什么原因?
在tnsnames.ora文件中检查设置好像没什么问题,用sqlplus也可以正常操作orcl 问题找到了,其实可简单,https://localhost:1158/em/console/logon/ ...
- codeforces 282E. Sausage Maximization Trie
题目链接 给n个数, 让你找出一个前缀和一个后缀, 它们异或完以后最大, 前缀和后缀都是异或得来的, 可以为空, 为空时按0算.前缀后缀不可覆盖. 这题好神, 竟然是Trie树... 首先将所有数的异 ...
- java 显示视频时间--玩的
1.显示视频时间 package view.time; import it.sauronsoftware.jave.Encoder; import it.sauronsoftware.jave.Mul ...
- ubuntu NFS
NFS(Network File System, 网络文件系统)可以通过网络将分享不同主机(不同的OS)的目录——可以通过NFS挂载远程主机的目录, 访问该目录就像访问本地目录一样! 一般而言, 使用 ...
- libCurl的文件上传
最近在需要使用curl的上传功能,使用libCurl来实现.因此,先使用curl命令操作,然后再使用libCurl实现. 基于Http协议的文件上传的标准方法是: 基于POST Form的文件上传 ...
- php定界符 <<< 的作用及使用注意事项
按照原样输出,包括换行符.特殊字符等 任何特殊字符都不需要转义,比如双引号.单引号,它会按照原样输出 像在双引号字符串中一样使用php的变量输出 定界符<<<,当需要输出大段文本时, ...
- Sicily-1443
一. 题意: 模拟队列的操作,按优先级pop.如果有元素pop,则其他在队列里面的元素的时间都要加1.如果队头的元素因为优先级不够高而要push回队列的时候,所有元素的时间都不用改变. 二. ...
- poj 3264 Balanced Lineup(线段树、RMQ)
题目链接: http://poj.org/problem?id=3264 思路分析: 典型的区间统计问题,要求求出某段区间中的极值,可以使用线段树求解. 在线段树结点中存储区间中的最小值与最大值:查询 ...
- 非常可乐(bfs)
非常可乐 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...