12

我想使用 iOS 7 显示一个视图 -PresentedView在另一个视图Background View上。在我的应用程序中,我正在使用UITabBArController,所以在运行时我不知道哪个视图将是背景视图(可能是任何标签栏项目)。下面是结构:

UITabBarController
  ---> TabItem1 - FirstUIViewController
  ---> TabItem2 - SecondUIViewController
  ---> TabItem3 - ThirdUIViewController

需要这样的东西:

在此处输入图像描述

当应用程序加载时,我在TabItem1 - FirstUIViewController. 当我点击 时TabItem3,我想出ThirdUIViewController现在 Top onFirstUIViewController并且“FirstUIViewController”应该出现在背景中,并且没有启用用户交互。

到目前为止我做了什么:

  1. 由于UIViewControllers添加为Relationship ControllersTabBar Item`UITabBarController 中显示,我添加了一个从 tabbarcontroller 到 ThridViewController 的 segue。

  2. 将此 Segue 的 PresentationStyle 更改为 UIModalPresentationStyle.CurrentContext 并进行了以下修改

    func `viewDidLoad()` {
        super.viewDidLoad()
        self.performSegue("identifier", sender: self)
    }
    

什么也没发生,我只看到白色背景的“ThridViewController”

  1. 我尝试了手动编码方法:

    func `viewDidLoad()` {
        super.viewDidLoad()
        let overlayController:UIThirdViewController = UIThirdViewController() //This controller has a view added on top of it, which covers top half screen only
        overlayController.modalPresentationStyle = UIModalPresentationStyle.CurrentContext
        self.presentViewController(overlayController, animated: true, completion: nil)
    }
    

不用找了。新视图会覆盖之前的视图。如果我添加这个overlayController.view.backgroundColor = UIColor.clearColor(),我会看到一半是黑色的,一半是包含我的新视图的

问题点:

  1. 我应该在哪里编写代码来初始化/调用 ThirdViewController 以显示在当前视图的顶部?
  2. 如何修复黑屏问题并使其在 iOS 7 上运行?

我正在使用 Xcode 7 并在 iOS7 上运行。请帮忙。工作代码片段将不胜感激。不要发布其他堆栈溢出帖子作为答案,除非代码有效并且您自己尝试过。

更新: - 使用这种方法,我得到一个黑屏

class TabBarViewController: UITabBarController, UITabBarControllerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.delegate = self
    }

    func tabBarController(tabBarController: UITabBarController, shouldSelectViewController viewController: UIViewController) -> Bool {

        let switchController:UIViewController = SwitchViewController()

        self.presentingViewController?.modalPresentationStyle = UIModalPresentationStyle.CurrentContext
        self.presentingViewController?.view.backgroundColor = UIColor.clearColor()
        self.presentViewController(switchController, animated: true, completion: nil)
        return false
    }
}
4

2 回答 2

4

您应该子类UITabBarController化并将其行为添加到自定义子类中。将UITabBarController代理设置为self然后当点击特定索引而不是让它切换选项卡时,您会以模态方式呈现菜单。这些UITabBarControllerDelegate方法将使您有机会做到这一点。

专门使用这个委托方法....

- tabBarController:shouldSelectViewController:

您可以在调用哪个选项卡时显示菜单并返回 NO。只是这个选项卡的空白视图控制器,因为它永远不会显示给用户。

对于过渡本身,我强烈建议使用的子类UIPresentationController将容器视图框架设置为比屏幕尺寸小一点,并添加“dimmingView”。这仅在 iOS8 上可用,所以如果你想要 iOS7,你将需要做更多骇人听闻的事情。

于 2015-09-05T05:46:17.943 回答
3

使其成为自定义容器视图控制器(Apple Docs)。工作示例代码:

class MyTabVC: UITabBarController, UITabBarControllerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.delegate = self
    }

    func tabBarController(tabBarController: UITabBarController, shouldSelectViewController viewController: UIViewController) -> Bool {
        presentThirdVC()
        return false
    }

    func presentThirdVC() {
        let myThirdVC = MyThirdVC.makeVC()

        myThirdVC.view.backgroundColor = UIColor.blackColor().colorWithAlphaComponent(0.1)
        addChildViewController(myThirdVC)
        var newFrame = CGRectInset(view.bounds, 0, 50) // hack, do what you want
        myThirdVC.view.frame = newFrame
        view.addSubview(myThirdVC.view)
        didMoveToParentViewController(myThirdVC)
    }

}

class MyThirdVC: UIViewController {
    class func makeVC() -> MyThirdVC {
        return UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("myThirdVC") as! MyThirdVC
    }
}

截屏:

在此处输入图像描述

于 2015-09-10T07:37:03.103 回答