美文网首页
iOS 模态转场动画一(初识)

iOS 模态转场动画一(初识)

作者: qinghan | 来源:发表于2020-03-25 19:48 被阅读0次

    1.转场动画在iOS开发中是非常重要的,现在有时间记录一下自己的学习过程。
    2.模态转场过程中有几个重要的类非常重要,要实现自定义需要很好的了解它们。

    UIViewControllerAnimatedTransitioning

    // 自定义转场动画时间
    - (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext{
        return 0.34f;
    }
    
    
    // 自定义转成动画具体实现
    - (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext{
        
        // 到哪个vc
        UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
        
        // 从哪个vc来
        UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
        
        // 获取过渡时候的容器view
        UIView *contentView  = [transitionContext containerView];;
        
        //...
    }
    

    我们看到这个协议主要有两个方法,我们可以通过实现上面的方法来自定义实现转场的过程

    UIViewControllerAnimatedTransitioning UIPercentDrivenInteractiveTransition

    其中UIPercentDrivenInteractiveTransition主要是实现UIViewControllerAnimatedTransitioning协议主要涉及到的函数

    //更新转场的进度
    - (void)updateInteractiveTransition:(CGFloat)percentComplete;
    //取消转场 
    - (void)cancelInteractiveTransition;
    //完成转场 
    - (void)finishInteractiveTransition;
    

    UIViewControllerTransitioningDelegate协议

    // 设置继承自UIPresentationController 的自定义类的属性
    - (UIPresentationController *)presentationControllerForPresentedViewController:(UIViewController *)presented presentingViewController:(UIViewController *)presenting sourceViewController:(UIViewController *)source
    {
        
        ZJPresentationController *presentVC = [[ZJPresentationController alloc]initWithPresentedViewController:presented presentingViewController:presenting];
        // 设置距离顶部的高度
        presentVC.height = STATUSBAR_H;
        
        return presentVC;
    }
    
    //控制器创建执行的动画(返回一个实现UIViewControllerAnimatedTransitioning协议的类)
    - (nullable id <UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source{
        
        //创建实现UIViewControllerAnimatedTransitioning协议的类(命名为AnimatedTransitioning)
        ZJPresentAnimation *animation = [[ZJPresentAnimation alloc] init];
        
        //将其状态改为出现
        animation.presented = YES;
        
        
        return animation;
    }
    
    // 控制器销毁执行的动画(返回一个实现UIViewControllerAnimatedTransitioning协议的类)
    - (nullable id <UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed{
    
        ////创建实现UIViewControllerAnimatedTransitioning协议的类(命名为AnimatedTransitioning)
        ZJPresentAnimation *animation = [[ZJPresentAnimation alloc] init];
    
        //将其状态改为出现
        animation.presented = NO;
        NSLog(@"ZJPresentAnimation  %d",self.isRight);
        animation.isRight = self.isRight;
        return animation;
    }
    
    // 返回一个交互的对象(实现UIViewControllerInteractiveTransitioning协议的类)
    -(id<UIViewControllerInteractiveTransitioning>)interactionControllerForDismissal:(id<UIViewControllerAnimatedTransitioning>)animator{
        return self.interactiveTransition;
    }
    

    可以实现自定转场的View样式

    UIPresentationController

    这个是系统自带的presentController,通过继承它可以实现一定的自定义

    /即将出现调用
    - (void)presentationTransitionWillBegin{
        [super presentationTransitionWillBegin];
        
        // 设置present视图的高度
        self.presentedView.frame = CGRectMake(0, _height, SCREEN_W, SCREEN_H);
        
        
        //    self.presentedView.backgroundColor = [UIColor whiteColor];
        self.presentedView.layer.cornerRadius = 7;
        // 添加到containerView 上
        [self.containerView addSubview:self.presentedView];
        
        
        //self.presentedView.layer.shadowRadius = _configuration.shadowRadius;
        //self.presentedView.layer.shadowOpacity = _configuration.shadowOpacity;
        
    }
    
    //出现调用
    - (void)presentationTransitionDidEnd:(BOOL)completed{
        // 如果呈现没有完成,那就移除背景 View
        [super presentationTransitionDidEnd:completed];
       
    }
    
    //即将销毁调用
    - (void)dismissalTransitionWillBegin{
        [super dismissalTransitionWillBegin];
        //self.containerView.backgroundColor = [UIColor redColor];
    }
    
    //销毁调用
    - (void)dismissalTransitionDidEnd:(BOOL)completed{
        [super dismissalTransitionDidEnd:completed];
        if (completed) {
            //一旦要自定义动画,必须自己手动移除控制器
            [self.presentedView removeFromSuperview];
            
        }
        
    }
    

    UIViewControllerContextTransitioning

    这个是很重要的一个协议,转场动画的上下文定义了转场时需要的元素,转场过程中的视图属性可以通过它获取

     // 到哪个vc
        UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
        
        // 从哪个vc来
        UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
        
        // 获取过渡时候的容器view
        UIView *contentView  = [transitionContext containerView];;
    
    

    基本的改了我们已经又了一个了解,真正的实现一些功能还需要自己动手去写一些demo

    相关文章

      网友评论

          本文标题:iOS 模态转场动画一(初识)

          本文链接:https://www.haomeiwen.com/subject/wmixuhtx.html