UIViewControllerTransitioningDelegate, UIViewControllerAnimatedTransitioning

  1 #import "ModelAnimationDelegate.h"
  2 #import <UIKit/UIKit.h>
  3 #import "MapVC.h"
  4 #import "MapLiuLanViewController.h"
  5 #import "MapCollectionViewCell.h"
  6 
  7 @interface ModelAnimationDelegate ()<UIViewControllerTransitioningDelegate, UIViewControllerAnimatedTransitioning>
  8 
  9 @property (nonatomic, assign) BOOL isPresentAnimationing;
 10 
 11 @end
 12 
 13 @implementation ModelAnimationDelegate
 14 
 15 //  视图弹出
 16 - (void)presentViewAnimation:(id <UIViewControllerContextTransitioning>)transitionContext {
 17     // 获取容器view
 18     UIView *containerView = [transitionContext containerView];
 19     // 获取目标view
 20     UIView *destinationView = [transitionContext viewForKey:UITransitionContextToViewKey];
 21     destinationView.alpha = 0;
 22     // 将目标view添加到容器view
 23     [containerView addSubview:destinationView];
 24     
 25     // 获取目标vc
 26     MapLiuLanViewController *destinationVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
 27     NSIndexPath *indexPath = destinationVC.indexPath;
 28     
 29     // 获取来源vc
 30     UINavigationController *naVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
 31     MapVC *sourceVC = (MapVC *)naVC.topViewController;
 32     // 获取来源view
 33     UICollectionView *collectionView = sourceVC.collectionView;
 34     MapCollectionViewCell *selectedCell = (MapCollectionViewCell *)[collectionView cellForItemAtIndexPath:indexPath];
 35     
 36     // 获取动画开始位置大小
 37     CGRect startFrame = [collectionView convertRect:selectedCell.frame toView:[UIApplication sharedApplication].keyWindow];
 38     
 39     UIImageView *animationImgView = [[UIImageView alloc] initWithFrame:startFrame];
 40     animationImgView.image = selectedCell.imgView.image;
 41     animationImgView.contentMode = UIViewContentModeScaleAspectFill;
 42     animationImgView.clipsToBounds = YES;
 43     [containerView addSubview:animationImgView];
 44     
 45     // 获取动画结束位置大小
 46     CGFloat w = WIDTH;
 47     CGFloat h = w / animationImgView.image.size.width * animationImgView.image.size.height;
 48     CGFloat x = 0;
 49     CGFloat y = (HEIGHT - h) / 2.0;
 50     CGRect endFrame = CGRectMake(x, y, w, h);
 51         
 52     // 执行过渡动画
 53     [UIView animateWithDuration:1.0 animations:^{
 54         animationImgView.frame = endFrame;
 55     } completion:^(BOOL finished) {
 56         [transitionContext completeTransition:YES];
 57         [UIView animateWithDuration:0.5 animations:^{
 58             destinationView.alpha = 1.0;
 59         } completion:^(BOOL finished) {
 60             [animationImgView removeFromSuperview];
 61         }];
 62     }];
 63 }
 64 
 65 //  视图消失
 66 - (void)dismissViewAnimation:(id <UIViewControllerContextTransitioning>)transitionContext {
 67     // 获取容器view
 68     UIView *containerView = [transitionContext containerView];
 69     // 获取目标view
 70     UIView *destinationView = [transitionContext viewForKey:UITransitionContextToViewKey];
 71     destinationView.alpha = 0;
 72     // 将目标view添加到容器view
 73     [containerView addSubview:destinationView];
 74     
 75     // 获取目标vc
 76     MapLiuLanViewController *destinationVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
 77     NSIndexPath *indexPath = destinationVC.indexPath;
 78     
 79     // 获取来源vc
 80     UINavigationController *naVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
 81     MapVC *sourceVC = (MapVC *)naVC.topViewController;
 82     // 获取来源view
 83     UICollectionView *collectionView = sourceVC.collectionView;
 84     MapCollectionViewCell *selectedCell = (MapCollectionViewCell *)[collectionView cellForItemAtIndexPath:indexPath];
 85     
 86     // 获取动画开始位置大小
 87     CGRect startFrame = [collectionView convertRect:selectedCell.frame toView:[UIApplication sharedApplication].keyWindow];
 88     
 89     UIImageView *animationImgView = [[UIImageView alloc] initWithFrame:startFrame];
 90     animationImgView.image = selectedCell.imgView.image;
 91     animationImgView.contentMode = UIViewContentModeScaleAspectFill;
 92     animationImgView.clipsToBounds = YES;
 93     [containerView addSubview:animationImgView];
 94     
 95     // 获取动画结束位置大小
 96     CGFloat w = WIDTH;
 97     CGFloat h = w / animationImgView.image.size.width * animationImgView.image.size.height;
 98     CGFloat x = 0;
 99     CGFloat y = (HEIGHT - h) / 2.0;
100     CGRect endFrame = CGRectMake(x, y, w, h);
101     
102     // 执行过渡动画
103     [UIView animateWithDuration:1.0 animations:^{
104         animationImgView.frame = endFrame;
105     } completion:^(BOOL finished) {
106         [transitionContext completeTransition:YES];
107         [UIView animateWithDuration:0.5 animations:^{
108             destinationView.alpha = 1.0;
109         } completion:^(BOOL finished) {
110             [animationImgView removeFromSuperview];
111         }];
112     }];
113 }
114 
115 #pragma mark ----- UIViewControllerTransitioningDelegate协议方法 -----
116 
117 - (nullable id <UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source {
118     _isPresentAnimationing = YES;
119     return self;
120 }
121 
122 - (nullable id <UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed {
123     _isPresentAnimationing = NO;
124     return self;
125 }
126 
127 
128 #pragma mark ----- UIViewControllerAnimatedTransitioning协议方法 -----
129 
130 - (NSTimeInterval)transitionDuration:(nullable id <UIViewControllerContextTransitioning>)transitionContext {
131     return 1.0;
132 }
133 
134 - (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext {
135     _isPresentAnimationing ? [self presentViewAnimation:transitionContext] : [self dismissViewAnimation:transitionContext];
136 }
137 
138 @end
View Code

 

posted @ 2016-08-11 13:37  多两口  阅读(1374)  评论(0编辑  收藏  举报