如何在所有场景中设置导航栏背景颜色

时间:2018-04-18 07:33:19

标签: ios swift

我有一个带有5个标签的标签视图。我还有一个导航栏,并使用以下代码更改其背景颜色:

//Change navigation colors
viewController.navigationController?.navigationBar.barTintColor = UIColor.orange
viewController.navigationController?.navigationBar.tintColor = UIColor.white
viewController.navigationController?.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white]

每个选项卡都有自己的视图控制器,因此我创建了一个具有静态方法viewDidLoad()的类UIHelper,而不是在setupNavigation(viewController: UIViewController)方法中放置相同的代码。所以<{1}}方法中的每个viewController中的我只是调用方法

viewDidLoad()

是否有更简单的方法来更改导航栏背景的全局颜色?

我使用的是Swift 4。

编辑:实际上我有一个UIHelper.setupNavigation(viewController: self) ,标签的每个视图控制器都会扩展它。因此MasterViewController UIHelper.setupNavigation中会调用MasterViewController

4 个答案:

答案 0 :(得分:4)

  

你有很多方法可以做到这一点:   的第一   创建一个 superViewController ,所有其他视图控制器都继承这个:

import UIKit

class SuperViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        self.navigationController?.navigationBar.barTintColor = UIColor.orange
        self.navigationController?.navigationBar.tintColor = UIColor.white
        self.navigationController?.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white]
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}
  

其他视图控制器:

class ViewController: SuperViewController {

    @IBOutlet weak var pageVC: UIView!
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}
  

现在你不需要在应用程序中设置导航颜色只在每个视图控制器中使用Inherit superViewcontroller。您可以在每个控制器中添加要遵循的所有常用方法。

第二种方法

///Common NavigationController for every controller used in application
class NavigationController: UINavigationController {

    // MARK: - View Lifecycle
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        self.navigationBar.barTintColor = UIColor.red
        self.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white]
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}
  
    

在您应用的任何位置使用此导航控制器。当你需要的时候      导航控制器然后在导航控制器中提供此类。

  

答案 1 :(得分:2)

您可以使用导航栏代理类(将设置转发到所有导航栏),例如在AppDelegate的方法didFinishLaunchingWithOptions中运行:

UINavigationBar.appearance().barTintColor = UIColor.orange
UINavigationBar.appearance().tintColor = UIColor.white
UINavigationBar.appearance().titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white]

答案 2 :(得分:0)

我想建议你再做一个方法。我认为它更具普遍性和灵活性。 所以我建议你只是UINavigationController的子类。您可以在项目中拥有任意数量的实现。您可以从代码中初始化此类,也可以在Storyboard文件中设置适当的类。

import UIKit

class CustomNavigationController: UINavigationController {

    override func viewDidLoad() {
        super.viewDidLoad()

        //Change navigation colors
        self.navigationBar.barTintColor = UIColor.orange
        self.navigationBar.tintColor = UIColor.white
        self.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white]
    }

    //this method allow you to ask each controller for status bar style in navigation stack
    override var childViewControllerForStatusBarStyle: UIViewController? {
        return self.topViewController
    }

}

在视图控制器类中,您也应该覆盖此属性

import UIKit

class ViewController: UIViewController {

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }

}

答案 3 :(得分:0)

要支持暗模式和 swift5,请在 AppDelegate 中使用它:

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

 UINavigationBar.appearance().titleTextAttributes = [NSAttributedString.Key.foregroundColor: .green]
    
    if #available(iOS 13.0, *) {
        if UITraitCollection.current.userInterfaceStyle == .dark {
            UINavigationBar.appearance().barTintColor = .black
        } else {
            UINavigationBar.appearance().barTintColor = .white
        }
    } else {
        UINavigationBar.appearance().barTintColor = .white
    }

...
return true
}