iOS页面抽屉效果的构思和实现

目前市场上很多APP都有抽屉效果的界面,界面大同小异,一下是我个人分析和实现的抽屉效果,我是以代码加注释的方式分析抽屉效果界面的搭建和效果的实现的.

实现效果图:



第一步:搭建界面



- (void)viewDidLoad {

[superviewDidLoad];

//搭建界面

[selfsetUpView];

}

- (void)setUpView{

//添加左边的View

UIView*leftV = [[UIViewalloc]initWithFrame:self.view.bounds];

//左边蓝色

leftV.backgroundColor= [UIColorblueColor];

[self.viewaddSubview:leftV];

添加右边的View

UIView*rightV = [[UIViewalloc]initWithFrame:self.view.bounds];

//右边縁色

rightV.backgroundColor= [UIColorgreenColor];

self.rightV= rightV;

[self.viewaddSubview:rightV];

//添加中间的View(中间一个最后添加,显示到最外面.)

UIView*mainV = [[UIViewalloc]initWithFrame:self.view.bounds];

//中间红色

mainV.backgroundColor= [UIColorredColor];

self.mainV= mainV;

[self.viewaddSubview:mainV];

}


//第二步.添加手势.能够让中间的红色View左右移动,要在控制器View加载完成时就要添加View



- (void)viewDidLoad {

[superviewDidLoad];

//搭建界面

[selfsetUpView];

//拖动手势

UIPanGestureRecognizer*pan = [[UIPanGestureRecognizeralloc]initWithTarget:selfaction:@selector(pan:)];

//添加手势

[self.mainVaddGestureRecognizer:pan];

}

//实现手势方法:

//当手指拖动时调用.

-(void)pan:(UIPanGestureRecognizer*)pan{

//获取手指在屏幕上面的偏移量

CGPointtransP = [pantranslationInView:self.mainV];

//在这里为什么不用Transform,是因为我们移动时,要改变的尺寸大小.用Transform只能改变它的位置.

self.mainV.transform  = CGAffineTransformTranslate(self.mainV.transform, transP.x, 0);

//计算mainV的Frame

//单独抽出一个方法来计算mainV的frame.因为要计算它的Y值和高度.代码会很多.所以单独抽出一个方法

self.mainV.frame= [selfframeWithOffsetX:transP.x];

//每次移动时判断当前MainV的x值是大于0还是小于0.如果是大于0 ,显示左边,小于0显示右边

if(self.mainV.frame.origin.x>0) {

self.rightV.hidden=YES;

}elseif(self.mainV.frame.origin.x<0){

self.rightV.hidden=NO;

}

//注意要做复位

[pansetTranslation:CGPointZeroinView:self.mainV];

}

//最大Y值为100

#define maxY100

//根据偏移量计算mainV的frame.

- (CGRect)frameWithOffsetX:(CGFloat)offsetX{

//取出最原始的Frame

CGRectframe =self.mainV.frame;

frame.origin.x+= offsetX;

//获取屏幕的宽度

//(计算Y值如果下图:找最大值.当Main.x拖动最大的时候,Main.y值也最大.main.x最大为屏幕的宽度)

//设定一个最大Y值MaxY为100,正好.当max.x为屏幕的宽度时,最大Y等于100

//所以Y值等于 main.y = main.x * maxY / ScreenW;

100 = 375 * 100 / 375;)

//有可能frame.origin.x有可能是小于0,小于0的话,得出的Y值就会小于0,小于0就会出现,红色的View向上走.

//对结果取绝对值.

frame.origin.y=fabs(frame.origin.x*maxY/screenW);

//计算frame的高度

//(当前Main的高度等于屏幕的高度减去两倍的Y值.)

frame.size.height=screenH-2* frame.origin.y;

//返回计算好的frame.

returnframe;

}

//第三步:当手指松开时做到自动定位.

MainV定位到右侧的X值

#define targetR275

MainV定位到右侧的X值

#define targetL -275

//当手指拖动时调用.

-(void)pan:(UIPanGestureRecognizer*)pan{

//获取手指在屏幕上面的偏移量

CGPointtransP = [pantranslationInView:self.mainV];

//在这里为什么不用Transform,是因为我们移动时,要改变的尺寸大小.用Transform只能改变它的位置.

self.mainV.transform  = CGAffineTransformTranslate(self.mainV.transform, transP.x, 0);

//计算mainV的Frame

//单独抽出一个方法来计算mainV的frame.因为要计算它的Y值和高度.代码会很多.所以单独抽出一个方法

self.mainV.frame= [selfframeWithOffsetX:transP.x];

//每次移动时判断当前MainV的x值是大于0还是小于0.如果是大于0 ,显示左边,小于0显示右边

if(self.mainV.frame.origin.x>0) {

self.rightV.hidden=YES;

}elseif(self.mainV.frame.origin.x<0){

self.rightV.hidden=NO;

}

//判断手指的状态

if(pan.state==UIGestureRecognizerStateEnded){

//当手指松开时进入执行

//记录最终判断结果后.定位的值.

CGFloattarget =0;

//当手指松开,要判断MainV的x值是否大于屏幕的一半.如果大于屏幕一半时,自动定位到右边一个位置.

if(self.mainV.frame.origin.x>screenW*0.5) {

target =targetR;

}elseif(CGRectGetMaxX(self.mainV.frame)

//当手指松开,要判断MainV的最大的X值是否小于屏幕的一半.如果小于屏幕的一半时,自动定位到左边的位置.

target =targetL;

}

最终定位的x值 - 当前的main.x的值. 求出便宜量.使其定位

CGFloatoffsetX = target -self.mainV.frame.origin.x;


//根据便宜量设置mainV的frame值

CGRectframe = [selfframeWithOffsetX:offsetX];

[UIViewanimateWithDuration:0.25animations:^{

//伴随动画设置frame

self.mainV.frame= frame;

}];

}

//注意要做复位

[pansetTranslation:CGPointZeroinView:self.mainV];

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,458评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,454评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,171评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,062评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,440评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,661评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,906评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,609评论 0 200
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,379评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,600评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,085评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,409评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,072评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,088评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,860评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,704评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,608评论 2 270

推荐阅读更多精彩内容