zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    csharp: Speech
    软件定义网络基础---OF-Config协议
    软件定义网络基础---OpenFlow协议
    软件定义网络基础---南向接口协议概述
    Win10+Ubuntu18.04安装双系统
    软件定义网络基础---OpenFlow流表
    软件定义网络基础---OpenFlow概述
    软件定义网络基础---SDN数据平面
    软件定义网络基础---SDN的核心思想
    软件定义网络基础---SDN的主流构架
  • 原文地址:https://www.cnblogs.com/xs514521/p/5760637.html
Copyright © 2011-2022 走看看