iOS 动画更换window的根控制器

在项目开发过程中,经常会遇到需要更换window根控制器的情况,这里把常用的方式以及可能遇到的情况总结了一下。

((AppDelegate *)[UIApplication sharedApplication].delegate).window.rootViewController = rootViewController;

这是最根本的方式,大部分开发者都会直接选择这种方式进行更换根控制器。但是这样的直接转换给人一种很生硬的感觉,所以很多人会选择添加一些动画来使更换变得友好一点。例如:

RootTabBarController *rootController = [[RootTabBarController alloc] init];
[UIView transitionFromView:currentRootViewController.view
                        toView:rootController.view
                      duration:1.0f
                       options:UIViewAnimationOptionTransitionFlipFromLeft
                    completion:^(BOOL finished) {
        [AppDelegate shareInstance].window.rootViewController = rootController;
    }];

这样添加是没有问题的,而且在更换控制器时产生了一个过渡动画,看着更舒服一点,但是这里有一个小坑,一些开发者在某个页面中想要更换控制器时喜欢使用self.view来进行视图切换,这个时候就很可能出现问题

如果你的根控制器只是一个UIViewController,那么使用self.view来进行视图切换是没有问题的,但是如果是一个UINavigationController或者UITabBarController时,在子控制器中使用self.view来进行视图切换,可能会导致动画结束之后出现白屏的现象!

这是因为使用上述动画切换视图时,是在同一个父视图上进行切换的,如果在UINavigationController或者UITabBarController的自控制器中使用self.view,它的父视图将不会是window,而是UIViewControllerWrapperView,在根控制器切换过之后,之前的控制器销毁,会连带着UIViewControllerWrapperView一块销毁,这样就导致了更换完之后出现白屏,解决方式很简单,一种是通过上面给出的那中方式,直接取当前根控制器的view来进行切换,或者是创建一个中间视图,以中间视图来进行视图切换,动画完成之后再更换根控制器。例如:

    UIImageView *transitionView = [[UIImageView alloc] initWithFrame:[UIScreen mainScreen].bounds];
    LoginViewController *loginViewController = [[LoginViewController alloc] init];
    // 将loginViewController.view绘制成图片
    transitionView.image = [Tool paintingPictureWithView:loginViewController.view];
    [UIView transitionFromView:self.view toView:transitionView duration:1.0f options:UIViewAnimationOptionTransitionFlipFromLeft completion:^(BOOL finished) {
        [transitionView removeFromSuperview];
        [AppDelegate shareInstance].window.rootViewController = loginViewController;
    }];
效果图.gif

戳这里看demo

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AI阅读 16,039评论 3 119
  • 前言的前言 唐巧前辈在微信公众号「iOSDevTips」以及其博客上推送了我的文章后,我的 Github 各项指标...
    VincentHK阅读 10,771评论 3 44
  • 孩子如何度过暑假是很多家长都比较头痛的问题,我们亦是如此。想着孩子在暑假里会生活没有规律,玩手机看电视,...
    听雨聆声阅读 4,799评论 2 7
  • 今天有点小伤感,可能想起曾经相近的人,慢慢由近至远,有点恍然。 心中无物的人,才担心别人的离去吧。如果我内心足够充...
    凌非阅读 1,118评论 0 0
  • 发现那个敢于奋不顾身,不带半分私利去追求爱情的自己已然死去。在此,写下此文惦念一下,那个天真浪漫而又傻里傻气...
    ZY映影阅读 1,280评论 0 0