如何为整个应用自定义 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?的主要内容,如果未能解决你的问题,请参考以下文章

如何为自定义控件创建事件

如何为自定义对话框设置边距?

如何为自定义 B2B 应用添加 Apple ID?

如何为快捷方式应用自定义 SiriKit 意图扩展以请求允许访问?

如何为应用程序在后台显示的通知设置自定义布局?

如何为 iOS 应用创建自定义容器视图?