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


[cpp] view plain copy print ?
  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. #import <UIKit/UIKit.h>
  9. typedef enum
  10. {
  11. DrawerViewStateUp = 0,
  12. DrawerViewStateDown
  13. }DrawerViewState;
  14. @interface DrawerView : UIView<UIGestureRecognizerDelegate>
  15. {
  16. UIImageView *arrow; //向上拖拽时显示的图片
  17. CGPoint upPoint; //抽屉拉出时的中心点
  18. CGPoint downPoint; //抽屉收缩时的中心点
  19. UIView *parentView; //抽屉所在的view
  20. UIView *contentView; //抽屉里面显示的内容
  21. DrawerViewState drawState; //当前抽屉状态
  22. }
  23. - (id)initWithView:(UIView *) contentview parentView :(UIView *) parentview;
  24. - (void)handlePan:(UIPanGestureRecognizer *)recognizer;
  25. - (void)handleTap:(UITapGestureRecognizer *)recognizer;
  26. - (void)transformArrow:(DrawerViewState) state;
  27. @property (nonatomic,retain) UIView *parentView;
  28. @property (nonatomic,retain) UIView *contentView;
  29. @property (nonatomic,retain) UIImageView *arrow;
  30. @property (nonatomic) DrawerViewState drawState;
  31. @end

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

这样就是实现了,图片是从360里面抠出来,处理的不是很好,大家见谅。

Demo的下载地址:http://download.csdn.net/detail/toss156/4177553

更多相关文章

  1. android手势操作&&实现滑动切换activity
  2. [UI]抽屉菜单DrawerLayout分析(一)
  3. Android通过手势实现翻页效果
  4. Android(安卓)ImageView手势缩放完整的实现
  5. Android(安卓)手势操作识别
  6. Android(安卓)3.0 r1 API中文文档(113) ――SlidingDrawer
  7. android 追踪手势移动
  8. android onTouchEvent 左右手势滑动事件处理
  9. Android学习札记20:ScaleGestureDetector

随机推荐

  1. 干货必读丨Android APK反编译
  2. 详谈 Android 高大上的图片加载框架 Glid
  3. Android系统架构特点及优劣分析
  4. Android(安卓)adb命令
  5. 3-14 servlet 传出对象给 Android
  6. android点击事件,第一次无效,第二次才响应
  7. Android消息机制Looper与VSync的传播
  8. 10个经典的Android开源应用项目
  9. Chronometer android计时器组件Chronomet
  10. android studio 通过wifi连接手机调试