博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
自定义转场动画
阅读量:5718 次
发布时间:2019-06-18

本文共 3018 字,大约阅读时间需要 10 分钟。

1.设置自定义样式

    CLNewWebViewController *web = [[CLNewWebViewController alloc] init];

    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:web];
    web.urlStr = model.url;
    // 自定义样式
    nav.modalPresentationStyle = UIModalPresentationCustom;
    nav.transitioningDelegate = self;
    [self presentViewController:nav animated:YES completion:nil];

2.实现UIViewControllerTransitioningDelegate代理方法。在这个方法中CoustomPresentationController是继承自UIPresentationController的自定义控制器

//这个方法是说明哪个控制器控制presentatingController、presentatedController
- (UIPresentationController *)presentationControllerForPresentedViewController:(UIViewController *)presented presentingViewController:(UIViewController *)presenting sourceViewController:(UIViewController *)source
{
    return [[CoustomPresentationController alloc] initWithPresentedViewController:presented presentingViewController:presenting];
}
 >在CoustomPresentationController实现几个方法

- (void)presentationTransitionWillBegin // 在这个方法中设置presentedView的尺寸,也就是跳转控制器的尺寸

{
    self.presentedView.frame = self.containerView.bounds;
    [self.containerView addSubview:self.presentedView];
}
- (void)presentationTransitionDidEnd:(BOOL)completed
{}
- (void)dismissalTransitionWillBegin
{}
- (void)dismissalTransitionDidEnd:(BOOL)completed
{
    [self.presentedView removeFromSuperview];
}

3.开始设置转场动画,在UIViewControllerTransitioningDelegate代理方法中实现下面2个方法

// 自定义PresentedController的动画

- (id<UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source
{   CLAnimatedTransitioning *anim = [[CLAnimatedTransitioning alloc] init];
    anim.presented = YES;
    return anim;  // 自己遵守UIViewControllerAnimatedTransitioning协议
}
// 自定义控制器消失时的动画
- (id<UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed
{
    CLAnimatedTransitioning *anim = [[CLAnimatedTransitioning alloc] init];
    anim.presented = NO;
    return anim;
}

>其中CLAnimatedTransitioning是继承自NSObject,并遵守UIViewControllerAnimatedTransitioning协议,实现协议的2个方法

#pragma mark - UIViewControllerAnimatedTransitioning

- (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext
{
    return 1;
}
// 在这个方法中实现转场动画 :modal和dismis都调用这个方法
- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext
{
    if (self.presented) {  // 记录哪一个是即将出现的视图哪一个是即将消失的视图
        UIView *toView = [transitionContext viewForKey:UITransitionContextToViewKey];
        toView.mj_y = -toView.mj_height;
        [UIView animateWithDuration:1 animations:^{
            toView.mj_y = 0;
        } completion:^(BOOL finished) {
            [transitionContext completeTransition:YES];
        }];
    } else {
        UIView *fromView = [transitionContext viewForKey:UITransitionContextFromViewKey];
        fromView.mj_y = 0;
        [UIView animateWithDuration:1 animations:^{
            fromView.mj_y = -fromView.mj_height;
        } completion:^(BOOL finished) {
            [transitionContext completeTransition:YES];
        }];
    }
}

转载于:https://www.cnblogs.com/darren-chen/p/5160239.html

你可能感兴趣的文章
《Ext JS模板与组件基本框架图----组件》
查看>>
英特尔收购人工智能创业公司Nervana
查看>>
新华三H3C服务器安装系统问题
查看>>
Java8-Collect收集Stream
查看>>
消除windows下的PyCharm中满屏的波浪线
查看>>
大数据学习资源最全版本(收藏)
查看>>
“水泊梁山“互联网有限公司一百单八将内部社交网络
查看>>
关于AI,程序员需要了解这些!
查看>>
spring+springmvc+mybatis构建系统
查看>>
Java并发编程笔记之ReentrantLock源码分析
查看>>
node_acl 权限管理路径通配
查看>>
Android重写onConfigurationChanged规避横竖屏切换时候重新进入onCreate生命周期
查看>>
图文分析ByteBuf是什么
查看>>
jsp的C标签一般使用方法以及js接收servlet中的对象及对象数字
查看>>
Locust---用蝗虫写压测,感觉比用AB要cool哈
查看>>
利用太赫兹助力超高速WiFi的研发,比现有技术快100倍
查看>>
linux中三个时间
查看>>
Linux服务管理之NTP服务器配置
查看>>
PHP开发经验总结
查看>>
【总结】Kylin创建Cube,以及优化
查看>>