it-swarm.com.ru

Представить представление модально из контроллера панели вкладок

Как я могу представить представление модально из контроллера панели вкладок, чтобы представление перешло поверх фактического?

Я хочу построить вид с помощью камеры. Что-то вроде «WhatsApp» или «Instagram», где в середине есть кнопка, по которой пользователь может щелкнуть, и отображается вид с камеры. 

Кроме того, пользователь должен переместить вкладку, которой он был раньше, когда была нажата кнопка закрытия.

Вот как мой ViewController подключен к TabBarController:  enter image description here

5
Josh Schärer

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

Метод делегата, который вам нужно реализовать: tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool

Возврат false из этого метода не даст контроллеру вкладок выбрать вашу вкладку, тогда вам просто нужно реализовать собственную логику для программного представления UIViewController.

Вот пример:

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

    // If your view controller is emedded in a UINavigationController you will need to check if it's a UINavigationController and check that the root view controller is your desired controller (or subclass the navigation controller)
    if viewController is YourViewControllerClass {

        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        if let controller = storyboard.instantiateViewController(withIdentifier: "storyboardID") as? YourViewControllerClass {
            controller.modalPresentationStyle = .fullScreen
            self.present(controller, animated: true, completion: nil)
        }

        return false
    }

    // Tells the tab bar to select other view controller as normal
    return true
}

Я не тестировал приведенный выше код, так как моя реализация немного отличается и имеет больше переменных. Общий принцип тот же.

Дайте мне знать, как вы поживаете, и я буду обновлять ответ, если это необходимо.

7
WsCandy

Предполагая, что вы соответствуете UITabBarControllerDelegate , вы можете реализовать:

func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {

    // here, you should edit "0" to be matched with your selected item
    // for instance, if there is 5 items and the desired item is in the middle, the compared value should be "2"
    if tabBarController.selectedIndex == 0 {

        // simply, you will need to get the desired view controller and persent it:
        let desiredStoryboard = UIStoryboard(name: "Main", bundle: nil)
        let desiredViewController = desiredStoryboard.instantiateViewController(withIdentifier: "storyboard id")

        present(desiredViewController, animated: true, completion: nil)

    }
}
3
Ahmad F
    let modalVC = self.storyboard?.instantiateViewController(withIdentifier: "ViewControllerIdentifier") 
    modalVC.modalTransitionStyle = .crossDissolve
    modalVC.modalPresentationStyle = .full or .overfullscreen // please check which of the options work
    self.present(modalVC, animated: true, completion: {

    })
0
Ray_Soham