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:
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: 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!
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!