it-swarm.com.de

Präsentieren Sie eine Ansicht modal von einem Registerleisten-Controller aus

Wie kann ich eine Ansicht modal von einem Registerleisten-Controller aus darstellen, sodass die Ansicht über die aktuelle Ansicht hinausgeht?

Ich möchte eine Ansicht mit einer Kamera erstellen. So etwas wie "WhatsApp" oder "Instagram", in dessen Mitte sich eine Schaltfläche befindet, auf die der Benutzer klicken kann, und die Kameraansicht wird angezeigt.

Darüber hinaus sollte der Benutzer die Registerkarte verschieben, die er zuvor beim Klicken auf die Schaltfläche zum Schließen hatte.

So wird mein ViewController mit dem TabBarController verbunden:  enter image description here

5
Josh Schärer

Ich musste etwas Ähnliches in einer App implementieren, die ich gerade erst baue. Das ist relativ einfach. Sie müssen eine Delegate-Methode von UITabBarController implementieren, um dies zu erreichen.

Die zu implementierende Delegate-Methode lautet: tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool

Wenn Sie bei dieser Methode false zurückgeben, kann der Tab-Controller Ihren Tab nicht mehr auswählen. Sie müssen lediglich Ihre eigene Logik implementieren, um die UIViewController programmgesteuert darzustellen.

Hier ist ein Beispiel:

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
}

Ich habe den obigen Code nicht getestet, da meine Implementierung leicht abweicht und mehr Variablen enthält. Das allgemeine Prinzip ist dasselbe.

Lassen Sie mich wissen, wie es Ihnen geht und ich werde die Antwort bei Bedarf aktualisieren.

7
WsCandy

Angenommen, Sie entsprechen UITabBarControllerDelegate , können Sie Folgendes implementieren:

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