在当前的标签控制器上使用导航控制器呈现视图控制器

6
当展示或者关闭视图控制器时,我不想一直隐藏和显示tabBar,因为这会导致糟糕的用户体验。相反,我想直接在tabBar之上呈现下一个视图控制器,这样当我通过从左向右慢慢拖动来关闭nextVC时,我可以看到tabBar隐藏在视图后面(如下图所示)。
注意,我的应用程序有两个标签,分别与两个视图控制器(VCA、VCB)相关联。两个视图控制器还嵌入了导航栏。目前,在VCA和VCB中,我调用以下函数进行视图跳转,并在viewWillappear时进行一些隐藏和显示(代码如下)。
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
    }

----------GOKUL的有效解决方案----------

Gokul的答案几乎是正确的。我尝试了他的解决方案并得出了以下改进,以消除需要冗余VC的需求,同时也消除了在tabVC出现之前短暂显示初始VC的需要。但是没有Gokul,我永远不会想出这个方法!

此外,Gokul的方法对我来说会产生一个错误,因为即使我有一个初始的“普通”VC作为LoginVC,在显示tabVC之前。如果用户需要登录,此loginVC仅是rootVC。因此,在大多数情况下将rootVC设置为tabVC,将导致无法注册navVC。

解决方案是将导航控制器和选项卡控制器嵌入一个VC中。但是,它仅在navVC位于TabBarVC之前才能正常工作。我不确定为什么,但允许我拥有navVC->tabVC->VC1 / VC2的唯一方法是先嵌入带有navVC的VC1,然后再次单击VC1以嵌入tabVC(它不允许我在tabVC之前插入一个,我还必须在嵌入NavVC后再次单击VC1)。

solution

3个回答

2

根据您的要求,我们需要对给定的视图层次结构进行一些小的更改

  • Let me explain step by step,

    1. To meet your requirement we have to add a UIViewController(let's say InitialVC) embedded with a UINavigationController and make it as initial viewcontroller.

    2. Then add a UITabbarController with 2 VC (VCA,VCB) // IMPORTANT: Without any navigationcontroller embedded.

    3. Add a segue between InitalVC and TabbarController with an unique identifier(ex: Initial)

    4. In viewWillAppear of InitalVC perform segue as below (InitialVC is unnecessary to our design we are using this just to bridge navigationController and tabbarController).

          self.performSegueWithIdentifier("Initial", sender: nil)
      
    5. In TabbarControllerclass hide your back button, this ensures that InitialVC is unreachable.

          override func viewDidLoad() {
             super.viewDidLoad()
             self.navigationItem.hidesBackButton = true
          }
      
    6. Now add a segue from a button between VCA and VCA1, thats it build and run you will see VCA1 presenting over VCA's tabbar.

  • What we have changed?

    1. Instead of adding UINavigationController inside UITabbarController we have done vice versa. We can't directly add Tabbar inside navigation to do that we are using InitialVC between them.

结果:

输入图像描述


这是一个结果展示,显示了一个图片。

非常清晰易懂的好解决方案!非常感谢。我已经更新了我的答案,并进行了一些改进,供需要的人参考。 - user172902

0

第一种方法是使用UIGraphicsGetImageFromCurrentImageContext创建选项卡的图像,并将其设置在其他视图的底部...

第二种方法是在另一个新窗口中显示下一个视图,该窗口位于选项卡上方,这样您就不需要再隐藏选项卡了,但似乎它在导航控制器中,因此这种方式似乎不可用。


0
隐藏和取消隐藏选项卡栏是不必要的。你只需要将 UITabBarController 嵌入到 UINavigationController 中即可。也就是说,将 UINavigationController 设为初始视图控制器,将 UITabBarController 设置为 UINavigationController 的根视图控制器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接