如何为整个应用自定义 UINavigationBar?
Posted
技术标签:
【中文标题】如何为整个应用自定义 UINavigationBar?【英文标题】:How to customize UINavigationBar for the entire app? 【发布时间】:2017-08-23 07:33:36 【问题描述】:这与之前提出的问题有点不同。 所以要友善。
整个应用都有一个不同颜色的导航栏。 整个应用程序的导航栏中几乎没有选项。它们都是一样的。我期待什么?
我已经为UINavigationController
创建了这个扩展,并且能够根据我将成为的视图控制器更改导航栏的背景颜色。
extension UINavigationController
func updateNavigationBar(withViewControllerID identifier: String?)
setupNavigationBarButtons()
if identifier == kFirstVCIdentifier
self.navigationBar.tintColor = .white
self.navigationBar.barTintColor = .red
else if identifier == kSecondVCIdentifier
self.navigationBar.tintColor = .white
self.navigationBar.barTintColor = .green
else if identifier == kThirdVCIdentifier
self.navigationBar.tintColor = .white
self.navigationBar.barTintColor = .blue
self.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white]
self.navigationBar.isTranslucent = false
self.navigationBar.clipsToBounds = false
self.navigationBar.shadowImage = UIImage.init()
self.view.backgroundColor = .clear
internal func setupNavigationBarButtons()
let barButtonItemSettings = UIBarButtonItem.init(title: "Settings", style: .plain, target: self, action: #selector(actionSettings))
let barButtonItemSpace = UIBarButtonItem.init(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
let barButtonItemLogOut = UIBarButtonItem.init(title: "LogOut", style: .plain, target: self, action: #selector(actionLogOut))
let buttons = [barButtonItemSettings, barButtonItemSpace, barButtonItemLogOut]
self.navigationItem.rightBarButtonItems = buttons
@objc internal func actionSettings()
print("Settings")
@objc internal func actionLogOut()
print("LogOut")
然后,我尝试在该扩展中添加UIBarButton
,但它们没有出现。所以我需要修复它。如果它是可见的,我如何获得它的动作调用,以便我可以在整个应用程序中处理 UIBarButton 的触摸事件。 正确?请不要打补丁。
我是这样使用它的:
override func viewWillAppear(_ animated: Bool)
super.viewWillAppear(animated)
self.navigationController?.updateNavigationBar(withViewControllerID: self.restorationIdentifier?)
【问题讨论】:
您可以隐藏导航栏并制作自定义视图 您是否尝试将目标 self 更改为 self.viewControllers.last ,它可能会有所帮助 【参考方案1】:试试这个并为 UINavigationItem 制作扩展。
extension UINaviationItem
func setupNavigationBarButtons()
let barButtonItemSettings = UIBarButtonItem.init(title: "Settings", style: .plain, target: self, action: #selector(actionSettings))
let barButtonItemSpace = UIBarButtonItem.init(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
let barButtonItemLogOut = UIBarButtonItem.init(title: "LogOut", style: .plain, target: self, action: #selector(actionLogOut))
let buttons = [barButtonItemSettings, barButtonItemSpace, barButtonItemLogOut]
self.rightBarButtonItems = buttons
@objc func actionSettings()
print("Settings")
if let current = UIApplication.shared.delegate?.window
var viewcontroller = current!.rootViewController
if(viewcontroller is UINavigationController)
viewcontroller = (viewcontroller as! UINavigationController).visibleViewController
print( "currentviewcontroller is %@/",viewcontroller )
@objc func actionLogOut()
print("LogOut")
self.navigationController?.updateNavigationBar(withViewControllerID: "second")
self.navigationItem.setupNavigationBarButtons()
【讨论】:
@Hemang 为什么你需要这个。您可以在单击栏按钮时使用委托或视图控制器。根据您的我正在获取当前的可见控制器。请在设置点击时检查更新答案。以上是关于如何为整个应用自定义 UINavigationBar?的主要内容,如果未能解决你的问题,请参考以下文章