实现IOS版的抽屉效果(点击,拖拽滑动)

好像最近,看到好多Android上的抽屉效果,也忍不住想要自己写一个。在Android里面可以用SlidingDrawer,很方便的实现。IOS上面就只有自己写了。其实原理很简单就是 UIView 的移动,和一些手势的操作。

 

 1 //
 2 //  DrawerView.h
 3 //  DrawerDemo
 4 //
 5 //  Created by Zhouhaifeng on 12-3-27.
 6 //  Copyright (c) 2012年 CJLU. All rights reserved.
 7 //
 8 
 9 #import <UIKit/UIKit.h>
10 
11 typedef enum
12 {
13     DrawerViewStateUp = 0,
14     DrawerViewStateDown
15 }DrawerViewState;
16 
17 @interface DrawerView : UIView<UIGestureRecognizerDelegate>
18 {
19     UIImageView *arrow;         //向上拖拽时显示的图片    
20  
21     CGPoint upPoint;            //抽屉拉出时的中心点
22     CGPoint downPoint;          //抽屉收缩时的中心点
23     
24     UIView *parentView;         //抽屉所在的view
25     UIView *contentView;        //抽屉里面显示的内容
26     
27     DrawerViewState drawState;  //当前抽屉状态
28 }
29 
30 - (id)initWithView:(UIView *) contentview parentView :(UIView *) parentview;
31 - (void)handlePan:(UIPanGestureRecognizer *)recognizer;
32 - (void)handleTap:(UITapGestureRecognizer *)recognizer;
33 - (void)transformArrow:(DrawerViewState) state;
34 
35 @property (nonatomic,retain) UIView *parentView;
36 @property (nonatomic,retain) UIView *contentView;
37 @property (nonatomic,retain) UIImageView *arrow;  
38 @property (nonatomic) DrawerViewState drawState; 
39 
40 @end
  1 //
  2 //  DrawerView.m
  3 //  DrawerDemo
  4 //
  5 //  Created by Zhouhaifeng on 12-3-27.
  6 //  Copyright (c) 2012年 CJLU. All rights reserved.
  7 //
  8 
  9 #import "DrawerView.h"
 10 
 11 @implementation DrawerView
 12 @synthesize contentView,parentView,drawState;
 13 @synthesize arrow;
 14 
 15 - (id)initWithView:(UIView *) contentview parentView :(UIView *) parentview;
 16 {
 17     self = [super initWithFrame:CGRectMake(0,0,contentview.frame.size.width, contentview.frame.size.height+40)];
 18     if (self) {
 19         // Initialization code        
 20         contentView = contentview;
 21         parentView = parentview;
 22         
 23         //一定要开启
 24         [parentView setUserInteractionEnabled:YES];
 25         
 26         //嵌入内容区域的背景
 27         UIImage *drawer_bg = [UIImage imageNamed:@"drawer_content.png"];
 28         UIImageView *view_bg = [[UIImageView alloc]initWithImage:drawer_bg];
 29         [view_bg setFrame:CGRectMake(0,40,contentview.frame.size.width, contentview.bounds.size.height+40)];
 30         [self addSubview:view_bg];
 31     
 32         //头部拉拽的区域背景
 33         UIImage *drawer_handle = [UIImage imageNamed:@"drawer_handlepng.png"];
 34         UIImageView *view_handle = [[UIImageView alloc]initWithImage:drawer_handle];
 35         [view_handle setFrame:CGRectMake(0,0,contentview.frame.size.width,40)];
 36         [self addSubview:view_handle];
 37         
 38         //箭头的图片
 39         UIImage *drawer_arrow = [UIImage imageNamed:@"drawer_arrow.png"];
 40         arrow = [[UIImageView alloc]initWithImage:drawer_arrow];
 41         [arrow setFrame:CGRectMake(0,0,28,28)];
 42         arrow.center = CGPointMake(contentview.frame.size.width/2, 20);
 43         [self addSubview:arrow];
 44         
 45         //嵌入内容的UIView
 46         [contentView setFrame:CGRectMake(0,40,contentview.frame.size.width, contentview.bounds.size.height+40)];
 47         [self addSubview:contentview];
 48         
 49         //移动的手势
 50         UIPanGestureRecognizer *panRcognize=[[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)];  
 51         panRcognize.delegate=self;  
 52         [panRcognize setEnabled:YES];  
 53         [panRcognize delaysTouchesEnded];  
 54         [panRcognize cancelsTouchesInView]; 
 55         
 56         [self addGestureRecognizer:panRcognize];
 57         
 58         //单击的手势
 59         UITapGestureRecognizer *tapRecognize = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handleTap:)];  
 60         tapRecognize.numberOfTapsRequired = 1;  
 61         tapRecognize.delegate = self;  
 62         [tapRecognize setEnabled :YES];  
 63         [tapRecognize delaysTouchesBegan];  
 64         [tapRecognize cancelsTouchesInView];  
 65         
 66         [self addGestureRecognizer:tapRecognize];
 67         
 68         //设置两个位置的坐标
 69         downPoint = CGPointMake(parentview.frame.size.width/2, parentview.frame.size.height+contentview.frame.size.height/2-40);
 70         upPoint = CGPointMake(parentview.frame.size.width/2, parentview.frame.size.height-contentview.frame.size.height/2-40);
 71         self.center =  downPoint;
 72         
 73         //设置起始状态
 74         drawState = DrawerViewStateDown;
 75     }
 76     return self;
 77 }
 78 
 79 
 80 #pragma UIGestureRecognizer Handles  
 81 /*    
 82  *  移动图片处理的函数 
 83  *  @recognizer 移动手势 
 84  */  
 85 - (void)handlePan:(UIPanGestureRecognizer *)recognizer {  
 86     
 87    
 88     CGPoint translation = [recognizer translationInView:parentView]; 
 89     if (self.center.y + translation.y < upPoint.y) {
 90         self.center = upPoint;
 91     }else if(self.center.y + translation.y > downPoint.y)
 92     {
 93         self.center = downPoint;
 94     }else{
 95         self.center = CGPointMake(self.center.x,self.center.y + translation.y);  
 96     }
 97     [recognizer setTranslation:CGPointMake(0, 0) inView:parentView];  
 98     
 99     if (recognizer.state == UIGestureRecognizerStateEnded) {  
100         [UIView animateWithDuration:0.75 delay:0.15 options:UIViewAnimationOptionCurveEaseOut animations:^{  
101                 if (self.center.y < downPoint.y*4/5) {
102                     self.center = upPoint;
103                     [self transformArrow:DrawerViewStateUp];
104                 }else
105                 {
106                     self.center = downPoint;
107                     [self transformArrow:DrawerViewStateDown];
108                 }
109 
110         } completion:nil];  
111  
112     }    
113 }  
114 
115 /* 
116  *  handleTap 触摸函数 
117  *  @recognizer  UITapGestureRecognizer 触摸识别器 
118  */  
119 -(void) handleTap:(UITapGestureRecognizer *)recognizer  
120 {  
121         [UIView animateWithDuration:0.75 delay:0.15 options:UIViewAnimationOptionTransitionCurlUp animations:^{  
122             if (drawState == DrawerViewStateDown) {
123                 self.center = upPoint;
124                 [self transformArrow:DrawerViewStateUp];
125             }else
126             {
127                 self.center = downPoint;
128                 [self transformArrow:DrawerViewStateDown];
129             }
130         } completion:nil];  
131  
132 } 
133 
134 /* 
135  *  transformArrow 改变箭头方向
136  *  state  DrawerViewState 抽屉当前状态 
137  */ 
138 -(void)transformArrow:(DrawerViewState) state
139 {
140         //NSLog(@"DRAWERSTATE :%d  STATE:%d",drawState,state);
141         [UIView animateWithDuration:0.3 delay:0.35 options:UIViewAnimationOptionCurveEaseOut animations:^{  
142            if (state == DrawerViewStateUp){   
143                     arrow.transform = CGAffineTransformMakeRotation(M_PI);
144                 }else
145                 {
146                      arrow.transform = CGAffineTransformMakeRotation(0);
147                 }
148         } completion:^(BOOL finish){
149                drawState = state;
150         }];  
151         
152    
153 }
154 
155 @end

 

iOS代码下载网站:http://appcodes.org/

posted on 2013-04-07 10:28  让子弹飞  阅读(1390)  评论(0编辑  收藏  举报