zoukankan      html  css  js  c++  java
  • 浏览大图的一种实现方式

    利用转场动画实现(这里不说转场动画),主要就是几个坐标的转换:将cell上的imageView快照生成一个snapView(直接创建一个ImageVIew也一样), 在将cell上image的frame 坐标转换到containerView上,在将snapView放大到目标尺寸 (首先你要知道转场动画时怎么一回事)。

     

    下面是主要代码,一个自定义类继承自NSObject。实现了UINavigationControllerDelegate、UIViewControllerAnimatedTransitioning协议

    - (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext {
        
        // 获取当前的控制器
        UIViewController *fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
        
        // 获取将要转向的控制器
        UIViewController *toVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
        
        // 获取容器视图
        UIView *containerView = [transitionContext containerView];
        
        UICollectionView *collectionView ;
        UIImageView *contentImageView;
        if (self.opration == PushAnimationOprationPush) {
            
            ViewController *from =  (ViewController *)fromVC;
            collectionView = from.collectionView;
            
            contentImageView = [toVC valueForKey:@"_contentImageView"];
        }else {
            
            ViewController *to =  (ViewController *)toVC;
            collectionView = to.collectionView;
            contentImageView = [fromVC valueForKey:@"_contentImageView"];
        }
        
        // 获取选中的cell 的indexpath
        NSArray *selectedItems = [collectionView indexPathsForSelectedItems];
        
        // 根据indexpath 获取 cell
        CusCollectionViewCell *cell = (CusCollectionViewCell *)[collectionView cellForItemAtIndexPath:[selectedItems firstObject]];
        
        UIView *snapView;
        CGRect snapViewFrame;
        CGRect snapViewTargetFrame;
        
        if (self.opration == PushAnimationOprationPush) {
            
            // 截取cell 上contentImage 的快照
            snapView = [cell.contentImage snapshotViewAfterScreenUpdates:NO];
            
            // 根据contentImage在cell上的坐标 转换到 containerView上
            snapViewFrame = [containerView convertRect:cell.contentImage.frame fromView:cell.contentImage.superview];
            
            // 获取目标控制器上要显示的 imageView,并根据该imageView的尺寸位置,转换到 容器视图上,成为snapView 最终尺寸。
            snapViewTargetFrame = [containerView convertRect:contentImageView.frame fromView:contentImageView.superview];
    
        }else {
            
            snapView = [contentImageView snapshotViewAfterScreenUpdates:NO];
            
            snapViewFrame = [containerView convertRect:contentImageView.frame fromView:contentImageView.superview];
            
            snapViewTargetFrame = [containerView convertRect:cell.contentImage.frame fromView:cell.contentImage];
            
        }
        
        snapView.frame = snapViewFrame;
        toVC.view.alpha = 0;
        
        [containerView addSubview:toVC.view];
        [containerView addSubview:snapView];
        
        contentImageView.hidden = YES;
        cell.contentImage.hidden = YES;
        
        
        [UIView animateWithDuration:[self transitionDuration:transitionContext] delay:0 usingSpringWithDamping:0.6f initialSpringVelocity:1.0f options:UIViewAnimationOptionCurveEaseInOut animations:^{
            snapView.frame = snapViewTargetFrame;
            toVC.view.alpha = 1.0;
        } completion:^(BOOL finished) {
            
            contentImageView.hidden = NO;
            cell.contentImage.hidden = NO;
            [snapView removeFromSuperview];
            [transitionContext completeTransition:![transitionContext transitionWasCancelled]];
        }];
        
    }
    - (id<UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController animationControllerForOperation:(UINavigationControllerOperation)operation fromViewController:(UIViewController *)fromVC toViewController:(UIViewController *)toVC {
        
        if (operation == UINavigationControllerOperationPush) {
            
            self.opration = PushAnimationOprationPush;
            
        }else if (operation == UINavigationControllerOperationPop) {
            
            self.opration = PushAnimationOprationPop;
        }
        return self;
    }
    
    - (void)start {
        self.nav.delegate = self;
    }
    
    /** 为目标控制器添加一个tap手势,返回上一个控制器 */
    - (void)tapGestureToPopWithController:(UIViewController *)targetVC {
        
        self.targetViewController = targetVC;
        UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapGesture:)];
        [targetVC.view addGestureRecognizer:tapGesture];
    }
    
    - (void)tapGesture:(UITapGestureRecognizer *)gesture {
        
        [self.targetViewController.navigationController popViewControllerAnimated:YES];
    }
  • 相关阅读:
    命令行工具--netstat
    Man手册--nmap
    bc -l 对于 %取模计算出错
    离散对数和原根 欧拉定理证明
    bc-win32-power-echo-vim-not-work
    2010版EXCEL下方sheet工作表隐藏了
    word多出空标题,样式是列出段落
    plantuml
    久石让《龙猫》豆豆龙 钢琴视奏版
    神奇校车 = topsage
  • 原文地址:https://www.cnblogs.com/CyanStone/p/5153564.html
Copyright © 2011-2022 走看看