2016-08-22 94 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

相关问题