在項目開發(fā)過程中,經常會遇到需要更換window根控制器的情況搂誉,這里把常用的方式以及可能遇到的情況總結了一下。
((AppDelegate *)[UIApplication sharedApplication].delegate).window.rootViewController = rootViewController;
這是最根本的方式,大部分開發(fā)者都會直接選擇這種方式進行更換根控制器广辰。但是這樣的直接轉換給人一種很生硬的感覺,所以很多人會選擇添加一些動畫來使更換變得友好一點主之。例如:
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;
}];
這樣添加是沒有問題的择吊,而且在更換控制器時產生了一個過渡動畫,看著更舒服一點槽奕,但是這里有一個小坑几睛,一些開發(fā)者在某個頁面中想要更換控制器時喜歡使用self.view來進行視圖切換,這個時候就很可能出現問題
如果你的根控制器只是一個UIViewController,那么使用self.view來進行視圖切換是沒有問題的粤攒,但是如果是一個UINavigationController或者UITabBarController時所森,在子控制器中使用self.view來進行視圖切換,可能會導致動畫結束之后出現白屏的現象夯接!
這是因為使用上述動畫切換視圖時焕济,是在同一個父視圖上進行切換的,如果在UINavigationController或者UITabBarController的自控制器中使用self.view钻蹬,它的父視圖將不會是window吼蚁,而是UIViewControllerWrapperView,在根控制器切換過之后问欠,之前的控制器銷毀肝匆,會連帶著UIViewControllerWrapperView一塊銷毀,這樣就導致了更換完之后出現白屏顺献,解決方式很簡單旗国,一種是通過上面給出的那中方式,直接取當前根控制器的view來進行切換注整,或者是創(chuà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