The design of my application consists of multiple viewControllers which all have different styling applied to them. The following code is used in every viewController to style the viewController:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.title = "PROFILE"
self.navigationController?.view.backgroundColor = .white
self.navigationController?.navigationBar.tintColor = self.view.tintColor
navigationController?.navigationBar.barStyle = .default
tabBarController?.tabBar.isTranslucent = false
tabBarController?.tabBar.backgroundColor = .white
tabBarController?.tabBar.tintColor = .black
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
self.navigationController?.navigationBar.tintColor = .white
self.navigationController?.view.backgroundColor = UIColor.clear
self.navigationController?.navigationBar.barStyle = .blackTranslucent
self.navigationController?.navigationBar.shadowImage = UIImage()
}
Some properties change per VC, for example the backgroundColor of the VC. This code is copy pasted in every VC I make with small changes, which causes a lot of duplicate code etc. Is there a design pattern which allows me to create the styling of every VC more conveniently?
1 Answer 1
extension UIViewController create a navigation bar Method call anywhere from ViewController in your project.navigation bar will appear and add more parameter color or other relevant change you want to achieved .
for example
import UIKit
extension UIViewController {
func setupNavigationBar(title: String) {
// back button without title
//self.navigationController?.navigationBar.topItem?.title = ""
//back button color
//self.navigationController?.navigationBar.tintColor = UIColor.white
//set titile
self.navigationItem.title = title
//set text color & font size
//self.navigationController?.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName:UIColor.init(red: 251/255, green: 251/255, blue: 251/255, alpha: 1) , NSFontAttributeName:UIFont.systemFont(ofSize: 19)]
//set background color without gradian effect
//self.navigationController?.navigationBar.barTintColor = UIColor.init(red: 134/255, green: 145/255, blue: 152/255, alpha: 1)
//show right button
let rightButton = UIBarButtonItem(image: #imageLiteral(resourceName: "Menu"), style: .plain, target: self, action: #selector(menu))
//right Bar Button Item tint color
//self.navigationItem.rightBarButtonItem?.tintColor = UIColor.init(red: 219/255, green: 219/255, blue: 219/255, alpha: 1)
//show the Menu button item
self.navigationItem.rightBarButtonItem = rightButton
//show bar button item tint color
//self.navigationItem.rightBarButtonItem?.tintColor = UIColor.init(red: 219/255, green: 219/255, blue: 219/255, alpha: 1)
}
func menu(){
print("showSlideOutMane fire ")
}
}