UIModalPresentationStyle.CurrentContext Swift iOS 7

я хочу показать вид - PresentedView по - другому Background View использование iOS 7. В моем приложении, я использую UITabBArController, поэтому во время выполнения я не знаю, какой вид будет у фона (может быть любой из элементов панели вкладок). Ниже приведена структура:

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

нужно что-то вроде этого:

enter image description here

когда приложение загружается, я на TabItem1 - FirstUIViewController. Когда я нажимаю на TabItem3, Я хочу ThirdUIViewController чтобы появиться сверху на FirstUIViewController и 'FirstUIViewController' должен появиться в фоновом режиме без вмешательства пользователя.

что я сделал до сих пор:

  1. С, UIViewControllers добавляются как Relationship Controllers появится как TabBar Item в ' UITabBarController я добавил сегмент от tabbarcontroller к ThridViewController.

  2. изменен 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)
    }
    

никаких изменений. Новое представление переопределяет представление previos. если я добавлю это 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
    }
}

2 ответов


сделайте его пользовательским контроллером представления контейнера (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
    }
}

скриншоты:

enter image description here


вы должны подкласс UITabBarController и добавьте его поведение в пользовательский подкласс. Установите UITabBarController делегат в качестве self а затем, когда конкретный индекс нажимается вместо того, чтобы позволить ему переключать вкладки, вы модально представляете меню. The UITabBarControllerDelegate методы дадут вам шанс сделать это.

Specifcally используя этот метод делегата....

- tabBarController:shouldSelectViewController:

вы можете представить меню, когда это вызывается, для которого когда-либо вкладка и возврат нет. Просто вы пустой viewController для эта вкладка, так как она никогда не будет отображаться пользователю.

для самого перехода я настоятельно рекомендую использовать подкласс UIPresentationController чтобы установить рамку представлений контейнера немного меньше размера экрана и добавить "dimmingView". Это доступно только на iOS8, хотя, если вы хотите iOS7, вам нужно будет сделать больше хакерских вещей.