iOS 動(dòng)畫更換window的根控制器

在項(xiàng)目開發(fā)過程中,經(jīng)常會(huì)遇到需要更換window根控制器的情況,這里把常用的方式以及可能遇到的情況總結(jié)了一下。

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

這是最根本的方式,大部分開發(fā)者都會(huì)直接選擇這種方式進(jìn)行更換根控制器。但是這樣的直接轉(zhuǎn)換給人一種很生硬的感覺,所以很多人會(huì)選擇添加一些動(dòng)畫來使更換變得友好一點(diǎn)。例如:

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;
    }];

這樣添加是沒有問題的,而且在更換控制器時(shí)產(chǎn)生了一個(gè)過渡動(dòng)畫,看著更舒服一點(diǎn),但是這里有一個(gè)小坑,一些開發(fā)者在某個(gè)頁面中想要更換控制器時(shí)喜歡使用self.view來進(jìn)行視圖切換,這個(gè)時(shí)候就很可能出現(xiàn)問題

如果你的根控制器只是一個(gè)UIViewController,那么使用self.view來進(jìn)行視圖切換是沒有問題的,但是如果是一個(gè)UINavigationController或者UITabBarController時(shí),在子控制器中使用self.view來進(jìn)行視圖切換,可能會(huì)導(dǎo)致動(dòng)畫結(jié)束之后出現(xiàn)白屏的現(xiàn)象!

這是因?yàn)槭褂蒙鲜鰟?dòng)畫切換視圖時(shí),是在同一個(gè)父視圖上進(jìn)行切換的,如果在UINavigationController或者UITabBarController的自控制器中使用self.view,它的父視圖將不會(huì)是window,而是UIViewControllerWrapperView,在根控制器切換過之后,之前的控制器銷毀,會(huì)連帶著UIViewControllerWrapperView一塊銷毀,這樣就導(dǎo)致了更換完之后出現(xiàn)白屏,解決方式很簡單,一種是通過上面給出的那中方式,直接取當(dāng)前根控制器的view來進(jìn)行切換,或者是創(chuàng)建一個(gè)中間視圖,以中間視圖來進(jìn)行視圖切換,動(dòng)畫完成之后再更換根控制器。例如:

    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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1、通過CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫組件 SD...
    陽明AI閱讀 16,205評(píng)論 3 119
  • 前言的前言 唐巧前輩在微信公眾號(hào)「iOSDevTips」以及其博客上推送了我的文章后,我的 Github 各項(xiàng)指標(biāo)...
    VincentHK閱讀 5,576評(píng)論 3 44
  • 孩子如何度過暑假是很多家長都比較頭痛的問題,我們亦是如此。想著孩子在暑假里會(huì)生活沒有規(guī)律,玩手機(jī)看電視,...
    聽雨聆聲閱讀 1,200評(píng)論 2 7
  • 今天有點(diǎn)小傷感,可能想起曾經(jīng)相近的人,慢慢由近至遠(yuǎn),有點(diǎn)恍然。 心中無物的人,才擔(dān)心別人的離去吧。如果我內(nèi)心足夠充...
    凌非閱讀 191評(píng)論 0 0
  • 發(fā)現(xiàn)那個(gè)敢于奮不顧身,不帶半分私利去追求愛情的自己已然死去。在此,寫下此文惦念一下,那個(gè)天真浪漫而又傻里傻氣...
    ZY映影閱讀 208評(píng)論 0 0

友情鏈接更多精彩內(nèi)容