Here is the solution I am using
Create a separate class that extends the instance UINavigationController
, let's call it BaseNavigationController
. Here is your class for you
If you are using storyboards, assign BaseNavigationController
your scene a UINavigationController in the storyboard
- , :
UINavigationController.init(rootViewController: someViewControllerInstance)
, BaseNavigationController.init(rootViewController: someViewControllerInstance)
:
open class BaseNavigationController:UINavigationController {
override open func viewDidLoad() {
super.viewDidLoad()
setNavigationBar()
setNavBarBorder(false)
}
func setNavigationBar(color:UIColor?=UIColor.white, tint:UIColor?=UIColor.darkGray){
let appearance = UIBarButtonItem.appearance()
appearance.setBackButtonTitlePositionAdjustment(UIOffset.init(horizontal: 0.0, vertical: 0), for: .default)
self.navigationBar.barTintColor = color!
self.navigationBar.isTranslucent = false
self.navigationBar.tintColor = tint!
self.navigationBar.titleTextAttributes = [ NSAttributedString.Key.foregroundColor: tint! ]
}
func setTitleColor(_ color:UIColor?=UIColor.darkGray){
}
func setNavBarBorder(_ enable:Bool) {
self.navigationBar.setBackgroundImage((enable ? nil : UIImage()), for: UIBarMetrics.default)
self.navigationBar.shadowImage = (enable ? nil : UIImage())
self.navigationBar.setValue(true, forKey: "hidesShadow")
}
}
: , viewWillLayoutSubviews
, viewWillAppear
.
viewController.
(self.navigationController as? BaseNavigationController)?. setNavBarBorder(false)
self.navigationBar.setValue(true, forKey: "hidesShadow")
, iOS.