web-dev-qa-db-fra.com

Swift Classe de contrôleur de navigation personnalisé

Tous ceux qui le lisent, bonjour et merci. J'écris une application comme Viber ou WhatsApp pour les appareils iOS en utilisant Xcode 8.2.1 et Swift 3.0. J'ai un problème: je veux que mon application dispose d'un contrôleur de navigation mais pas simple, je Je veux que ce soit personnalisé. Il y a un écran d'impression de WhatsApp pour comprendre ce que j'essaie de réaliser:

Screenshot of WhatsApp chat with somebody

Comme nous pouvons le voir, ce contrôleur de navigation a 3 boutons, une étiquette et une image avec un avatar. Je veux également changer ma couleur en vert. Pour cette raison, j'ai créé une classe:

import UIKit

class CustomNavigationController: UINavigationController {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.navigationBar.barTintColor = UIColor.green


        let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 39, height: 39))
        imageView.contentMode = .scaleAspectFit
        let image = UIImage(named: "logo")
        imageView.image = image
        navigationItem.titleView = imageView


    }
}

Et cela donne ce résultat: enter image description here Comme vous pouvez le voir, c'est sans image. Je sais que si j'ajoute ce code:

        let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 39, height: 39))
        imageView.contentMode = .scaleAspectFit
        let image = UIImage(named: "logo")
        imageView.image = image
        navigationItem.titleView = imageView

à ViewController, une image avec logo apparaîtra mais je veux une classe complète que je connecterai quelque part (par exemple, dans Interface Builder) et cela fera un beau contrôleur de navigation avec des boutons, des images et etc. De plus, je peux créer une classe différente avec un autre contrôleur de navigation et le connecter à différents écrans, sur lesquels, par exemple, je n'aurai pas besoin d'images, seulement de boutons. La question est donc: comment créer une classe de contrôleur de navigation personnalisée?

Je serai vraiment heureux et reconnaissant pour toute aide, merci!

9
Alex

Maintenant, je connais la réponse! Il sera écrit pour Swift 4.1.2. Chaque classe héritée de UIViewController a une propriété self.navigationController?.navigationBar ou navigationItem. Vous pouvez créer votre propre classe comme ceci:

class CustomNavigationController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let color = UIColor(red: 81 / 255, green: 155 / 255, blue: 22 / 255, alpha: 1.0)
        self.navigationController?.navigationBar.barTintColor = color

        let image = UIImage(named: "logo")
        let imageView = UIImageView(image: image)
        imageView.contentMode = .scaleAspectFit
        navigationItem.titleView = imageView
    }

    private func imageView(imageName: String) -> UIImageView {
        let logo = UIImage(named: imageName)
        let logoImageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 35, height: 35))
        logoImageView.contentMode = .scaleAspectFit
        logoImageView.image = logo
        logoImageView.widthAnchor.constraint(equalToConstant: 35).isActive = true
        logoImageView.heightAnchor.constraint(equalToConstant: 35).isActive = true
        return logoImageView
    }

    func barImageView(imageName: String) -> UIBarButtonItem {
        return UIBarButtonItem(customView: imageView(imageName: imageName))
    }

    func barButton(imageName: String, selector: Selector) -> UIBarButtonItem {
        let button = UIButton(type: .custom)
        button.setImage(UIImage(named: imageName), for: .normal)
        button.frame = CGRect(x: 0, y: 0, width: 35, height: 35)
        button.widthAnchor.constraint(equalToConstant: 35).isActive = true
        button.heightAnchor.constraint(equalToConstant: 35).isActive = true
        button.addTarget(self, action: selector, for: .touchUpInside)
        return UIBarButtonItem(customView: button)
    }

}

Maintenant, vous pouvez hériter l'un de vous UIViewControllers de cette classe CustomNavigationController et ajouter autant de boutons, d'icônes, changer les couleurs, les logos et etc. autant que vous le souhaitez (bien sûr, dans la plage normale)! Comme ça:

class ViewController: CustomNavigationController {

    override func viewDidLoad() {
        super.viewDidLoad()

        navigationItem.leftBarButtonItem = barImageView(imageName: "picture1")

        let firstImage = barImageView(imageName: "picture2")
        let secondButton = barButton(imageName: "picture3", selector: #selector(secondButtonPressed))

        navigationItem.rightBarButtonItems = [firstImage, secondButton]
    }

    @objc func secondButtonPressed() {
        print("Pressed")
    }

}

Ceci est ma solution, peut-être pas la meilleure, mais 100% fonctionne! Je vous remercie!

7
Alex