Подтвердить что ты не робот

UIModalPresentationStyle.CurrentContext Swift iOS 7

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

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

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

введите описание изображения здесь

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

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

  • Так как UIViewControllers добавляются как Relationship Controllers для отображения как TabBar Item в `UITabBarController, я добавил segue из tabbarcontroller в ThridViewController.

  • Изменен PresentationStyle для этого Segue в 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(), я вижу половину экрана черного и половины, содержащий мой новый вид

Проблемные точки:

  • Где я должен писать код для инициализации/вызова ThirdViewController для отображения поверх текущего представления?
  • Как устранить проблему с черным экраном и заставить ее работать на iOS 7?

Я использую Xcode 7 и работаю на iOS7. Пожалуйста помоги. Будет оценен фрагмент рабочего кода. Не отправляйте сообщения о переполнении стека в качестве ответа, если только код не работает, и вы сами пробовали.

UPDATE:. При таком подходе я получаю черный экран

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
    }
}
4b9b3361

Ответ 1

Сделайте это настраиваемым контроллером просмотра контейнера (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
    }
}

Скриншот:

введите описание изображения здесь

Ответ 2

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

В частности, используя этот метод делегата....

- tabBarController:shouldSelectViewController:

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

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