跨Navigation跳轉(類似微信)方案一

下面是方案一,不推薦使用,在我們的項目(項目比結構較複雜)時候一段時間後發現了一個bug,有時會在tabbar上留一行白色區域,正好是navgationBar的高度.而且這種做法比較複雜.不過是一種很有意思的思路!

效果

*微信跳轉,在通訊錄Navi點人聊天

IMG_5075.PNG
IMG_5076.PNG

*聊天界面返回的時候tabbar回到了會話列表“微信”的Navi上,而且左滑返回看到的也是“微信”的Navi

IMG_5079.PNG
IMG_5077.PNG

實現思路

一個OrignNavigationController包裹我們正常的UITabBarController

以往的寫法

MainTabBarController *mainTabBarController = [[MainTabBarController alloc] init];
self.window.rootViewController = mainTabBarController;

我們的寫法

MainTabBarController *mainTabBarController = [[MainTabBarController alloc] init];
StartNavigationController *nav = [[StartNavigationController alloc] initWithRootViewController:mainTabBarController];
self.window.rootViewController = nav;

點人聊天時我們的操作
1.用tabbarController的NavigationController(即StartNavigationController)進行push操作跳轉到聊天界面

UINavigationController* nav = ((AppDelegate*)[UIApplication sharedApplication].delegate).mainController.navigationController; // 我們用appdele持有tabbarController
[nav pushViewController:sessionVC animated:YES];

2.上面操作以後的效果看起來確實有跳轉,但是如果此時點擊聊天界面的返回按鈕(以微信爲例)返回到的界面是"通訊裏"而不是"微信"的會話列表
3.偷樑換柱-所以我們需要做點操作讓返回的時候回到"微信"
在聊天界面中作如下操作

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    MainTabBarController* mainTabBarController = ((AppDelegate*)[UIApplication sharedApplication].delegate).mainController;
    [mainTabBarController setSelectedIndex:MessageIndex]; // tabbar切換回"微信"Navi
    // 下一步很關鍵也很難理解,所以重點解釋下
    /*
        1.要明白self.navigationController是StartNavigationController
        2.此時整個app的結構是window包着StartNavigationController,StartNavigationController包着一個棧底控制器MainTabbBarController和一個棧頂控制器聊天Controller
    */
    [self.navigationController setViewControllers:@[mainTabBarController,self]];
    UINavigationController* navigation = mainTabBarController.viewControllers[self.comingFromNavigationController - 1];
    [navigation popToRootViewControllerAnimated:NO]; // 最後記得把"通訊錄"Navi要popToRoot
}

上面的操作主要是對tabbarController的層次界面情況進行調整

4.最後要注意的
StartNavigationController要自定義寫一個,並且設置

[self.navigationBar setTranslucent:YES];

不然會導致該Navi下的控制器下移44的高度

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章