UIView+Animation.m 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. //
  2. // UIView+Animation.m
  3. //
  4. //
  5. // Created by Jeans on 3/9/13.
  6. // Copyright (c) 2013 Jeans. All rights reserved.
  7. //
  8. #import "UIView+Animation.h"
  9. #import "AppDelegate.h"
  10. #define kScaleMin 0.007f
  11. #define kScaleDefault 1.0f
  12. #define kScaleDelta 0.05f
  13. #define kFirstAnimateTime 0.3f
  14. #define kSecondAnimateTime 0.2f
  15. #define kMaskViewFinalAlpha 0.2f //背景的透明度
  16. @interface ViewInfo : NSObject{
  17. AnimateType aType; //动画类型
  18. UIView *displayView; //显示页面
  19. CGRect displayRect; //显示的位置
  20. UIControl *maskView; //遮挡页面
  21. void (^showBlock)(BOOL finished);
  22. void (^hideBlock)(BOOL finished);
  23. }
  24. @property (retain, nonatomic) UIView *displayView;
  25. @property (assign, nonatomic) AnimateType aType;
  26. @property (assign, nonatomic) CGRect displayRect;
  27. @property (retain, nonatomic) UIControl *maskView;
  28. @property (copy, nonatomic) void (^showBlock)(BOOL finished);
  29. @property (copy, nonatomic) void (^hideBlock)(BOOL finished);
  30. @end
  31. @implementation ViewInfo
  32. @synthesize displayView,aType,maskView,displayRect,showBlock,hideBlock;
  33. - (void)dealloc{
  34. // Block_release(hideBlock);
  35. // Block_release(showBlock);
  36. // [maskView release];
  37. // [displayView release];
  38. // [super dealloc];
  39. }
  40. @end
  41. @implementation UIView (Animation)
  42. static NSMutableArray *displayViewAry;//已显示的页面数组
  43. #pragma mark - 获取顶部View
  44. + (AppDelegate *)getAppDelegate {
  45. return (AppDelegate *)[[UIApplication sharedApplication] delegate];
  46. }
  47. + (UIView *)getTopView{
  48. return [[[UIView getAppDelegate] window] viewForBaselineLayout];
  49. }
  50. #pragma mark - 顶层maskView触摸
  51. + (void)setTopMaskViewCanTouch:(BOOL)_canTouch{
  52. ViewInfo *info = [displayViewAry lastObject];
  53. if (_canTouch)
  54. [info.maskView addTarget:self action:@selector(maskViewTouch) forControlEvents:UIControlEventTouchUpInside];
  55. else
  56. [info.maskView removeTarget:self action:@selector(maskViewTouch) forControlEvents:UIControlEventTouchUpInside];
  57. }
  58. #pragma mark - 下面的增加了完成块
  59. /**
  60. 显示view
  61. @param _view 需要显示的view
  62. @param _aType 动画类型
  63. @param _fRect 最终位置
  64. @param completion 动画块
  65. */
  66. + (void)showView:(UIView*)_view animateType:(AnimateType)_aType finalRect:(CGRect)_fRect completion:(void(^)(BOOL finished))completion{
  67. //初始化页面数组
  68. if (displayViewAry == nil)
  69. displayViewAry = [[NSMutableArray alloc]init];
  70. UIView *topView = [UIView getTopView];
  71. //存储页面信息
  72. ViewInfo *info = [[ViewInfo alloc]init];
  73. info.displayView = _view;
  74. info.aType = _aType;
  75. info.displayRect = _fRect;
  76. //初始化遮罩页面
  77. UIControl *maskView = [[UIControl alloc]init];
  78. maskView.backgroundColor = [UIColor blackColor];
  79. maskView.alpha = 0;
  80. maskView.frame = topView.bounds;
  81. [maskView addTarget:self action:@selector(maskViewTouch) forControlEvents:UIControlEventTouchUpInside];
  82. //添加页面
  83. [topView addSubview:maskView];
  84. [topView bringSubviewToFront:maskView];
  85. info.maskView = maskView;
  86. // [maskView release];
  87. if (completion)
  88. info.showBlock = completion;
  89. [displayViewAry addObject:info];
  90. // [info release];
  91. //根据不同的动画类型显示
  92. switch (_aType) {
  93. case AnimateTypeOfTV:
  94. [UIView showTV];
  95. break;
  96. case AnimateTypeOfPopping:
  97. [UIView showPopping];
  98. default:
  99. break;
  100. }
  101. }
  102. /**
  103. 显示view
  104. @param _view 需要显示的view
  105. @param _aType 动画类型
  106. @param _fRect 最终位置
  107. */
  108. + (void)showView:(UIView*)_view animateType:(AnimateType)_aType finalRect:(CGRect)_fRect{
  109. [self showView:_view animateType:_aType finalRect:_fRect completion:nil];
  110. }
  111. #pragma mark - 消失view
  112. + (void)hideViewByCompletion:(void(^)(BOOL finished))completion{
  113. if ([displayViewAry count] > 0){
  114. ViewInfo *info = [displayViewAry lastObject];
  115. if (completion)
  116. info.hideBlock = completion;
  117. }
  118. [UIView maskViewTouch];
  119. }
  120. + (void)hideViewByType:(AnimateType)_aType completion:(void(^)(BOOL finished))completion{
  121. if ([displayViewAry count] > 0){
  122. ViewInfo *info = [displayViewAry lastObject];
  123. info.aType = _aType;
  124. if (completion)
  125. info.hideBlock = completion;
  126. }
  127. [UIView maskViewTouch];
  128. }
  129. //
  130. + (void)hideView{
  131. [UIView hideViewByCompletion:nil];
  132. }
  133. + (void)hideViewByType:(AnimateType)_aType{
  134. [UIView hideViewByType:_aType completion:nil];
  135. }
  136. #pragma mark - 触摸背景
  137. + (void)maskViewTouch{
  138. if ([displayViewAry count] > 0){
  139. ViewInfo *info = [displayViewAry lastObject];
  140. //根据不同类型隐藏
  141. switch (info.aType) {
  142. case AnimateTypeOfTV:
  143. [UIView hideTV];
  144. break;
  145. case AnimateTypeOfPopping:
  146. [UIView hidePopping];
  147. break;
  148. default:
  149. break;
  150. }
  151. }
  152. }
  153. #pragma mark - 移除遮罩和已显示页面
  154. + (void)removeMaskViewAndDisplay:(ViewInfo*)info{
  155. if (info.aType == AnimateTypeOfTV || info.aType == AnimateTypeOfPopping) //TV,Popping 类型需要还原
  156. info.displayView.transform = CGAffineTransformMakeScale(kScaleDefault, kScaleDefault);
  157. [info.displayView removeFromSuperview];
  158. [info.maskView removeFromSuperview];
  159. [displayViewAry removeObject:info];
  160. }
  161. #pragma mark - 显示动画
  162. #pragma mark - TV 显示
  163. + (void)showTV{
  164. ViewInfo *info = [displayViewAry lastObject];
  165. UIView *topView = [UIView getTopView];
  166. info.displayView.frame = info.displayRect;
  167. [topView addSubview:info.displayView];
  168. [topView bringSubviewToFront:info.displayView];
  169. info.displayView.transform = CGAffineTransformMakeScale(kScaleMin, kScaleMin);
  170. //开始动画
  171. [UIView animateWithDuration:kSecondAnimateTime animations:^{
  172. info.maskView.alpha = 0.1f;
  173. info.displayView.transform = CGAffineTransformMakeScale(kScaleDefault, kScaleMin);
  174. }completion:^(BOOL finish){
  175. [UIView animateWithDuration:kFirstAnimateTime animations:^{
  176. info.maskView.alpha = kMaskViewFinalAlpha;
  177. info.displayView.transform = CGAffineTransformMakeScale(kScaleDefault, kScaleDefault);
  178. }completion:^(BOOL finish){
  179. //调用完成动画块
  180. if (info.showBlock)
  181. info.showBlock(finish);
  182. }];
  183. }];
  184. }
  185. #pragma mark - TV 消失
  186. + (void)hideTV{
  187. ViewInfo *info = [displayViewAry lastObject];
  188. [UIView animateWithDuration:kSecondAnimateTime animations:^{
  189. info.displayView.transform = CGAffineTransformMakeScale(kScaleDefault, kScaleMin);
  190. }completion:^(BOOL finish){
  191. [UIView animateWithDuration:kFirstAnimateTime animations:^{
  192. info.displayView.transform = CGAffineTransformMakeScale(kScaleMin, kScaleMin);
  193. info.maskView.alpha = 0;
  194. }completion:^(BOOL finish){
  195. //调用完成动画块
  196. if (info.hideBlock)
  197. info.hideBlock(finish);
  198. [UIView removeMaskViewAndDisplay:info];
  199. }];
  200. }];
  201. }
  202. #pragma mark - Popping 显示
  203. + (void)showPopping{
  204. ViewInfo *info = [displayViewAry lastObject];
  205. UIView *topView = [UIView getTopView];
  206. info.displayView.frame = info.displayRect;
  207. [topView addSubview:info.displayView];
  208. [topView bringSubviewToFront:info.displayView];
  209. info.displayView.transform = CGAffineTransformMakeScale(kScaleMin, kScaleMin);
  210. //开始动画
  211. [UIView animateWithDuration:kFirstAnimateTime animations:^{
  212. info.maskView.alpha = kMaskViewFinalAlpha;
  213. info.displayView.transform = CGAffineTransformMakeScale(kScaleDefault+kScaleDelta, kScaleDefault+kScaleDelta);
  214. }completion:^(BOOL finish){
  215. [UIView animateWithDuration:kSecondAnimateTime animations:^{
  216. info.displayView.transform = CGAffineTransformMakeScale(kScaleDefault-kScaleDelta, kScaleDefault-kScaleDelta);
  217. }completion:^(BOOL finish){
  218. [UIView animateWithDuration:kSecondAnimateTime animations:^{
  219. info.displayView.transform = CGAffineTransformMakeScale(kScaleDefault, kScaleDefault);
  220. }completion:^(BOOL finish){
  221. //调用完成动画块
  222. if (info.showBlock)
  223. info.showBlock(finish);
  224. }];
  225. }];
  226. }];
  227. }
  228. #pragma mark - Popping 消失
  229. + (void)hidePopping{
  230. ViewInfo *info = [displayViewAry lastObject];
  231. [UIView animateWithDuration:kFirstAnimateTime animations:^{
  232. info.maskView.alpha = 0;
  233. info.displayView.transform = CGAffineTransformMakeScale(kScaleMin, kScaleMin);
  234. }completion:^(BOOL finish){
  235. //调用完成动画块
  236. if (info.hideBlock)
  237. info.hideBlock(finish);
  238. [UIView removeMaskViewAndDisplay:info];
  239. }];
  240. }
  241. @end