2016-08-22 130 views
5

當呈現或解散VC時,我不想繼續隱藏和顯示tabBar,因爲它會創建糟糕的用戶體驗。相反,我想將下一個VC直接放在標籤欄上,這樣當我通過從左向右緩慢拖動下一個VC時,可以看到隱藏在視圖後面的TabBar(如下圖所示)當前視圖控制器當前帶有NavigationController的tabBarController

注意,我的應用程序有兩個與兩個VC(VCA,VCB)相關聯的選項卡。這兩個VC也都嵌入了導航欄。 VCA繼續到VCA1,VCB繼續到VCB1。目前,在VCA和VCB內部,我正在調用以下函數以在viewWillapar(下面的代碼)中執行一些隱藏和取消隱藏操作。

self.navigationController?.showViewController(vc, sender: self) 

Tabbar behind VC

// Inside ViewWillAppear Only reappear the tab bar if we successfully enter Discover VC (To prevent drag back half way causing tab bar to cause comment entry to be floating). This code check if we have successfully enters DiscoverVC 
    if let tc = transitionCoordinator() { 
     if tc.initiallyInteractive() == true { 
      tc.notifyWhenInteractionEndsUsingBlock({(context: UIViewControllerTransitionCoordinatorContext) -> Void in 
       if context.isCancelled() { 
        // do nothing! 
       } 
       else { 
        // not cancelled, do it 
        self.tabbarController.tabBar.hidden = false 
       } 
      }) 
     } else { 
      // not interactive, do it 
      self.tabbarController.tabBar.hidden = false 
     } 
    } else { 
     // not interactive, do it 
     self.tabbarController.tabBar.hidden = false 
    } 

----------從戈庫爾工作液-----------

戈庫爾的答案是接近現貨上。我使用了他的解決方案,並提出了以下改進措施,以消除冗餘VC的需求,並且在tabVC出現之前也消除了短暫顯示的初始VC。但沒有Gokul,我永遠不會想出這個!

此外,Gokul的方法會爲我創建一個錯誤,因爲即使在顯示tabVC之前,我確實有一個初始的「正常」VC作爲LoginVC。如果用戶需要登錄,則此loginVC僅爲rootVC。所以通過在大多數情況下將rootVC設置爲tabVC,navVC將永遠不會被註冊。

解決方案是將導航控制器和tabBar控制器嵌入到一個VC中。但它只有在navVC位於TabBarVC之前時才起作用。我不知道爲什麼,但讓navVC-> tabVC-> VC1/VC2的唯一方法是首先將VC1與navVC嵌入,而不是再次單擊VC1以嵌入tabVC(它不允許我先插入一個tabVC和我也不得不在嵌入NavVC後再次點擊VC1)。

solution

回答

0

1的方式是使用UIGraphicsGetImageFromCurrentImageContext創建的TabBar的圖像,並把它放在其他視圖的底部...

第二個方法是顯示另一個新窗口,是下一個視圖在標籤欄上方,這樣你就不需要隱藏標籤欄了,但看起來像它在導航控制器中,所以這種方式似乎不可用

0

隱藏和取消隱藏標籤欄是不必要的。您只需要在UINavigationController內嵌入UITabBarController。即,UINavigationController作爲初始vc,UITabBarController作爲UINavigationController的根vc。

1

對於您的要求,我們需要在你給視圖層次一些小的修改

  • 讓我解釋一步一步,

    1. 滿足您的要求,我們必須添加一個UIViewController (假設InitialVC)嵌入UINavigationController並使其爲initial viewcontroller

    2. 然後用2 VC(VCA,VCB)// 重要添加UITabbarController沒有嵌入任何navigationcontroller

    3. 添加segue InitalVC和TabbarController與唯一標識符之間(例如:初始)

    4. viewWillAppear的InitalVC執行賽格瑞如下(InitialVC不需要我們的設計中,我們使用的是這只是爲了橋接navigationControllertabbarController)。

      self.performSegueWithIdentifier("Initial", sender: nil) 
      
    5. TabbarController類隱藏你的背扣,這確保了InitialVC不可達。

      override func viewDidLoad() { 
           super.viewDidLoad() 
           self.navigationItem.hidesBackButton = true 
          } 
      
    6. 現在從一個按鈕添加一個segueVCAVCA1之間,這就是它建立和運行,你會看到VCA1展示了VCA的TabBar。

  • 我們改變了什麼?

    1. 而不是在UITabbarController裏面加UINavigationController我們反之亦然。我們不能直接在導航欄中添加Tabbar來做我們正在使用的InitialVC

結果:

enter image description here

+0

很好解釋,並很好的解決方案!非常感謝。我已經更新了我的回答,並對上述任何需要改進的人員進行了改進 – user172902

+0

謝謝edward。 :) – Gokul

相關問題