123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285 |
- //
- // UIView+Animation.m
- //
- //
- // Created by Jeans on 3/9/13.
- // Copyright (c) 2013 Jeans. All rights reserved.
- //
- #import "UIView+Animation.h"
- #import "AppDelegate.h"
- #define kScaleMin 0.007f
- #define kScaleDefault 1.0f
- #define kScaleDelta 0.05f
- #define kFirstAnimateTime 0.3f
- #define kSecondAnimateTime 0.2f
- #define kMaskViewFinalAlpha 0.2f //背景的透明度
- @interface ViewInfo : NSObject{
- AnimateType aType; //动画类型
- UIView *displayView; //显示页面
- CGRect displayRect; //显示的位置
- UIControl *maskView; //遮挡页面
- void (^showBlock)(BOOL finished);
- void (^hideBlock)(BOOL finished);
- }
- @property (retain, nonatomic) UIView *displayView;
- @property (assign, nonatomic) AnimateType aType;
- @property (assign, nonatomic) CGRect displayRect;
- @property (retain, nonatomic) UIControl *maskView;
- @property (copy, nonatomic) void (^showBlock)(BOOL finished);
- @property (copy, nonatomic) void (^hideBlock)(BOOL finished);
- @end
- @implementation ViewInfo
- @synthesize displayView,aType,maskView,displayRect,showBlock,hideBlock;
- - (void)dealloc{
- // Block_release(hideBlock);
- // Block_release(showBlock);
- // [maskView release];
- // [displayView release];
- // [super dealloc];
- }
- @end
- @implementation UIView (Animation)
- static NSMutableArray *displayViewAry;//已显示的页面数组
- #pragma mark - 获取顶部View
- + (AppDelegate *)getAppDelegate {
- return (AppDelegate *)[[UIApplication sharedApplication] delegate];
- }
- + (UIView *)getTopView{
- return [[[UIView getAppDelegate] window] viewForBaselineLayout];
- }
- #pragma mark - 顶层maskView触摸
- + (void)setTopMaskViewCanTouch:(BOOL)_canTouch{
- ViewInfo *info = [displayViewAry lastObject];
- if (_canTouch)
- [info.maskView addTarget:self action:@selector(maskViewTouch) forControlEvents:UIControlEventTouchUpInside];
- else
- [info.maskView removeTarget:self action:@selector(maskViewTouch) forControlEvents:UIControlEventTouchUpInside];
- }
- #pragma mark - 下面的增加了完成块
- /**
- 显示view
- @param _view 需要显示的view
- @param _aType 动画类型
- @param _fRect 最终位置
- @param completion 动画块
- */
- + (void)showView:(UIView*)_view animateType:(AnimateType)_aType finalRect:(CGRect)_fRect completion:(void(^)(BOOL finished))completion{
- //初始化页面数组
- if (displayViewAry == nil)
- displayViewAry = [[NSMutableArray alloc]init];
-
- UIView *topView = [UIView getTopView];
-
- //存储页面信息
- ViewInfo *info = [[ViewInfo alloc]init];
- info.displayView = _view;
- info.aType = _aType;
- info.displayRect = _fRect;
-
- //初始化遮罩页面
- UIControl *maskView = [[UIControl alloc]init];
- maskView.backgroundColor = [UIColor blackColor];
- maskView.alpha = 0;
- maskView.frame = topView.bounds;
- [maskView addTarget:self action:@selector(maskViewTouch) forControlEvents:UIControlEventTouchUpInside];
- //添加页面
- [topView addSubview:maskView];
- [topView bringSubviewToFront:maskView];
-
- info.maskView = maskView;
- // [maskView release];
-
- if (completion)
- info.showBlock = completion;
-
- [displayViewAry addObject:info];
- // [info release];
-
-
- //根据不同的动画类型显示
- switch (_aType) {
- case AnimateTypeOfTV:
- [UIView showTV];
- break;
- case AnimateTypeOfPopping:
- [UIView showPopping];
- default:
- break;
- }
- }
- /**
- 显示view
- @param _view 需要显示的view
- @param _aType 动画类型
- @param _fRect 最终位置
- */
- + (void)showView:(UIView*)_view animateType:(AnimateType)_aType finalRect:(CGRect)_fRect{
- [self showView:_view animateType:_aType finalRect:_fRect completion:nil];
- }
- #pragma mark - 消失view
- + (void)hideViewByCompletion:(void(^)(BOOL finished))completion{
- if ([displayViewAry count] > 0){
- ViewInfo *info = [displayViewAry lastObject];
- if (completion)
- info.hideBlock = completion;
- }
- [UIView maskViewTouch];
- }
- + (void)hideViewByType:(AnimateType)_aType completion:(void(^)(BOOL finished))completion{
- if ([displayViewAry count] > 0){
- ViewInfo *info = [displayViewAry lastObject];
- info.aType = _aType;
- if (completion)
- info.hideBlock = completion;
- }
- [UIView maskViewTouch];
- }
- //
- + (void)hideView{
- [UIView hideViewByCompletion:nil];
- }
- + (void)hideViewByType:(AnimateType)_aType{
- [UIView hideViewByType:_aType completion:nil];
- }
- #pragma mark - 触摸背景
- + (void)maskViewTouch{
- if ([displayViewAry count] > 0){
- ViewInfo *info = [displayViewAry lastObject];
-
- //根据不同类型隐藏
- switch (info.aType) {
- case AnimateTypeOfTV:
- [UIView hideTV];
- break;
- case AnimateTypeOfPopping:
- [UIView hidePopping];
- break;
- default:
- break;
- }
- }
- }
- #pragma mark - 移除遮罩和已显示页面
- + (void)removeMaskViewAndDisplay:(ViewInfo*)info{
- if (info.aType == AnimateTypeOfTV || info.aType == AnimateTypeOfPopping) //TV,Popping 类型需要还原
- info.displayView.transform = CGAffineTransformMakeScale(kScaleDefault, kScaleDefault);
-
- [info.displayView removeFromSuperview];
- [info.maskView removeFromSuperview];
- [displayViewAry removeObject:info];
- }
- #pragma mark - 显示动画
- #pragma mark - TV 显示
- + (void)showTV{
- ViewInfo *info = [displayViewAry lastObject];
- UIView *topView = [UIView getTopView];
- info.displayView.frame = info.displayRect;
- [topView addSubview:info.displayView];
- [topView bringSubviewToFront:info.displayView];
-
- info.displayView.transform = CGAffineTransformMakeScale(kScaleMin, kScaleMin);
-
- //开始动画
- [UIView animateWithDuration:kSecondAnimateTime animations:^{
- info.maskView.alpha = 0.1f;
- info.displayView.transform = CGAffineTransformMakeScale(kScaleDefault, kScaleMin);
- }completion:^(BOOL finish){
- [UIView animateWithDuration:kFirstAnimateTime animations:^{
- info.maskView.alpha = kMaskViewFinalAlpha;
- info.displayView.transform = CGAffineTransformMakeScale(kScaleDefault, kScaleDefault);
- }completion:^(BOOL finish){
- //调用完成动画块
- if (info.showBlock)
- info.showBlock(finish);
- }];
- }];
- }
- #pragma mark - TV 消失
- + (void)hideTV{
-
- ViewInfo *info = [displayViewAry lastObject];
-
- [UIView animateWithDuration:kSecondAnimateTime animations:^{
- info.displayView.transform = CGAffineTransformMakeScale(kScaleDefault, kScaleMin);
- }completion:^(BOOL finish){
- [UIView animateWithDuration:kFirstAnimateTime animations:^{
- info.displayView.transform = CGAffineTransformMakeScale(kScaleMin, kScaleMin);
- info.maskView.alpha = 0;
- }completion:^(BOOL finish){
- //调用完成动画块
- if (info.hideBlock)
- info.hideBlock(finish);
- [UIView removeMaskViewAndDisplay:info];
- }];
- }];
- }
- #pragma mark - Popping 显示
- + (void)showPopping{
- ViewInfo *info = [displayViewAry lastObject];
- UIView *topView = [UIView getTopView];
- info.displayView.frame = info.displayRect;
- [topView addSubview:info.displayView];
- [topView bringSubviewToFront:info.displayView];
-
- info.displayView.transform = CGAffineTransformMakeScale(kScaleMin, kScaleMin);
-
- //开始动画
- [UIView animateWithDuration:kFirstAnimateTime animations:^{
- info.maskView.alpha = kMaskViewFinalAlpha;
- info.displayView.transform = CGAffineTransformMakeScale(kScaleDefault+kScaleDelta, kScaleDefault+kScaleDelta);
- }completion:^(BOOL finish){
- [UIView animateWithDuration:kSecondAnimateTime animations:^{
- info.displayView.transform = CGAffineTransformMakeScale(kScaleDefault-kScaleDelta, kScaleDefault-kScaleDelta);
- }completion:^(BOOL finish){
- [UIView animateWithDuration:kSecondAnimateTime animations:^{
- info.displayView.transform = CGAffineTransformMakeScale(kScaleDefault, kScaleDefault);
- }completion:^(BOOL finish){
- //调用完成动画块
- if (info.showBlock)
- info.showBlock(finish);
- }];
- }];
- }];
- }
- #pragma mark - Popping 消失
- + (void)hidePopping{
- ViewInfo *info = [displayViewAry lastObject];
-
- [UIView animateWithDuration:kFirstAnimateTime animations:^{
- info.maskView.alpha = 0;
- info.displayView.transform = CGAffineTransformMakeScale(kScaleMin, kScaleMin);
- }completion:^(BOOL finish){
- //调用完成动画块
- if (info.hideBlock)
- info.hideBlock(finish);
- [UIView removeMaskViewAndDisplay:info];
- }];
- }
- @end
|