Изменение цвета панели навигации в Swift


240

Я использую вид выбора, чтобы позволить пользователю выбрать цветовую тему для всего приложения.

Я планирую изменить цвет панели навигации, фона и, возможно, панели вкладок (если это возможно).

Я изучал, как это сделать, но не могу найти примеров Swift. Может ли кто-нибудь дать мне пример кода, который мне нужно будет использовать для изменения цвета панели навигации и цвета текста панели навигации?

Представление Picker настроено, я просто ищу код для изменения цвета интерфейса.

Ответы:


526

Панель навигации:

navigationController?.navigationBar.barTintColor = UIColor.green

Замените greenColor на любой UIColor, который вы хотите, вы также можете использовать RGB, если хотите.

Текст навигационной панели:

navigationController?.navigationBar.titleTextAttributes = [.foregroundColor: UIColor.orange]

Замените orangeColor на любой понравившийся вам цвет.

Панель вкладок:

tabBarController?.tabBar.barTintColor = UIColor.brown

Текст панели вкладок:

tabBarController?.tabBar.tintColor = UIColor.yellow

На последних двух замените brownColor и yellowColor на выбранный вами цвет.


Большое спасибо! Я был недалеко от того, что я пытался, но у меня не все было в порядке.
user3746428

Я не уверен. Если вы используете push segue в отличие от модального, это должна быть та же панель навигации, но я не совсем уверен. Сожалею.
trumpeter201

2
После обновления до более новых бета-версий Xcode установка цвета текста заголовка больше не работает. titleTextAttributes не доступен в Swift. Любые идеи?
user3746428

1
Не могли бы вы открыть новый вопрос и, возможно, ссылку на него? Чат не лучшее место для чего-то подобного.
trumpeter201

3
Я обнаружил, что это заставляет меня использовать NSForegroundColorAttributeName в качестве имени атрибута, но в остальном работает отлично.
Джейк Холл,

90

Вот некоторые основные настройки внешнего вида, которые вы можете применять в приложении:

UINavigationBar.appearance().backgroundColor = UIColor.greenColor()
UIBarButtonItem.appearance().tintColor = UIColor.magentaColor()
//Since iOS 7.0 UITextAttributeTextColor was replaced by NSForegroundColorAttributeName
UINavigationBar.appearance().titleTextAttributes = [UITextAttributeTextColor: UIColor.blueColor()]
UITabBar.appearance().backgroundColor = UIColor.yellowColor();

Подробнее об UIAppearanceAPI в Swift вы можете прочитать здесь: https://developer.apple.com/documentation/uikit/uiappearance


Итак, как бы я использовал это, чтобы изменить цвет панели навигации для всего приложения? На данный момент у меня просто есть: self.navigationController.navigationBar.barTintColor = UIColor.newBlueColor () и, конечно, это просто меняет цвет панели навигации контроллера представления, внутри которого находится код. Как я могу использовать его, чтобы изменить все панели навигации? Я пытался использовать: UINavigationBar.appearance (). BackgroundColor = UIColor.newBlueColor (), но, похоже, ничего не делает.
user3746428

4
Чтобы отразить изменения в приложении entier, вставьте приведенный ниже метод приложения FunD AppDelegate.swift (приложение: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {// Поместить над кодом}
Badrinath

7
Используйте barTintColor вместо backgroundColor. UINavigationBar.appearance (). BarTintColor = UIColor.greenColor ()
Майкл Петерсон

@ Keenle Я немного запутался ... Почему изменение цвета фона UINavigationBar через API внешнего вида не меняет свой цвет полностью? Я попытался установить цвет фона на синий, и это дало мне странный оттенок пурпурно-синего ...
fja

60

Обновлено для Swift 3, 4, 4.2, 5+

// setup navBar.....
UINavigationBar.appearance().barTintColor = .black
UINavigationBar.appearance().tintColor = .white
UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName: UIColor.white]
UINavigationBar.appearance().isTranslucent = false

Swift 4

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

Swift 4.2, 5+

UINavigationBar.appearance().barTintColor = .black
UINavigationBar.appearance().tintColor = .white
UINavigationBar.appearance().titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
UINavigationBar.appearance().isTranslucent = false

Также можете проверить здесь: https://github.com/hasnine/iOSUtilitiesSource


Swift 4.2: NSAttributedString.Key.foregroundColor
Касра Бабаи,

установка цвета оттенка на белый вместо bartintcolor показывает исходный цвет. Большой!
NickCoder

@NickCoder ценю это. :) также проверьте мою
библиотеку

52
UINavigationBar.appearance().barTintColor = UIColor(red: 46.0/255.0, green: 14.0/255.0, blue: 74.0/255.0, alpha: 1.0)
UINavigationBar.appearance().tintColor = UIColor.whiteColor()
UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName : UIColor.whiteColor()]

Просто вставьте эту строку didFinishLaunchingWithOptionsв ваш код.


Я пробовал это с RGB, и это не работает, независимо от того, где я его положил.
Натан МакКаскле

@NathanMcKaskle Проверьте свой RGB, он должен быть в формате "xx / 250.0f".
Мохит Томар

Используется в didFinishLaunchingWithOptions и работает отлично. Внутри viewDidLoad не работает идеально.
Тоухид

26

В AppDelegate это глобально изменило формат NavBar и удаляет нижнюю границу / границу (которая является проблемной областью для большинства людей), чтобы дать вам то, что я думаю, что вы и другие ищете:

 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    UINavigationBar.appearance().setBackgroundImage(UIImage(), forBarPosition: UIBarPosition.Any, barMetrics: UIBarMetrics.Default)
    UINavigationBar.appearance().shadowImage = UIImage()
    UINavigationBar.appearance().tintColor = UIColor.whiteColor()
    UINavigationBar.appearance().barTintColor = Style.SELECTED_COLOR
    UINavigationBar.appearance().translucent = false
    UINavigationBar.appearance().clipsToBounds = false
    UINavigationBar.appearance().backgroundColor = Style.SELECTED_COLOR
    UINavigationBar.appearance().titleTextAttributes = [NSFontAttributeName : (UIFont(name: "FONT NAME", size: 18))!, NSForegroundColorAttributeName: UIColor.whiteColor()] }

Затем вы можете настроить файл Constants.swift , и он будет содержать структуру Style с цветами и шрифтами и т. Д. Затем вы можете добавить tableView / pickerView к любому ViewController и использовать массив «availableThemes», чтобы позволить пользователю изменять themeColor.

Прекрасная вещь в этом заключается в том, что вы можете использовать одну ссылку во всем приложении для каждого цвета, и она будет обновляться на основе выбранной пользователем «Темы», а без нее по умолчанию будет использоваться theme1 ():

import Foundation
import UIKit

struct Style {


static let availableThemes = ["Theme 1","Theme 2","Theme 3"]

static func loadTheme(){
    let defaults = NSUserDefaults.standardUserDefaults()
    if let name = defaults.stringForKey("Theme"){
        // Select the Theme
        if name == availableThemes[0]   { theme1()  }
        if name == availableThemes[1]   { theme2()  }
        if name == availableThemes[2]   { theme3()  }
    }else{
        defaults.setObject(availableThemes[0], forKey: "Theme")
        theme1()
    }
}

 // Colors specific to theme - can include multiple colours here for each one
static func theme1(){
   static var SELECTED_COLOR = UIColor(red:70/255, green: 38/255, blue: 92/255, alpha: 1) }

static func theme2(){
    static var SELECTED_COLOR = UIColor(red:255/255, green: 255/255, blue: 255/255, alpha: 1) }

static func theme3(){
    static var SELECTED_COLOR = UIColor(red:90/255, green: 50/255, blue: 120/255, alpha: 1) } ...

2
Спасибо, твой ответ действительно помог мне, по крайней мере, для меня, я использовал первую его часть, и это было потрясающе и очень полезно
Ameer Fares

1
Большое спасибо, человек, я попробовал каждый ответ здесь, и ни один из них не сработал, кроме твоего: D
Ронак Шах

19

Чтобы сделать это на раскадровке (Инспектор Интерфейсного Разработчика)

С помощью этого IBDesignableмы можем добавить дополнительные параметры в Инспектор Интерфейсного Разработчика UINavigationControllerи настроить их на раскадровке. Сначала добавьте следующий код в ваш проект.

@IBDesignable extension UINavigationController {
    @IBInspectable var barTintColor: UIColor? {
        set {
            guard let uiColor = newValue else { return }
            navigationBar.barTintColor = uiColor
        }
        get {
            guard let color = navigationBar.barTintColor else { return nil }
            return color
        }
    }
}

Затем просто установите атрибуты для контроллера навигации на раскадровке.

введите описание изображения здесь

Этот подход также можно использовать для управления цветом текста панели навигации из раскадровки:

@IBInspectable var barTextColor: UIColor? {
  set {
    guard let uiColor = newValue else {return}
    navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: uiColor]
  }
  get {
    guard let textAttributes = navigationBar.titleTextAttributes else { return nil }
    return textAttributes[NSAttributedStringKey.foregroundColor] as? UIColor
  }
}

18

Свифт 4:

Отлично работающий код для изменения внешнего вида панели навигации на уровне приложения.

введите описание изображения здесь

// MARK: Navigation Bar Customisation

// To change background colour.
UINavigationBar.appearance().barTintColor = .init(red: 23.0/255, green: 197.0/255, blue: 157.0/255, alpha: 1.0)

// To change colour of tappable items.
UINavigationBar.appearance().tintColor = .white

// To apply textAttributes to title i.e. colour, font etc.
UINavigationBar.appearance().titleTextAttributes = [.foregroundColor : UIColor.white,
                                                    .font : UIFont.init(name: "AvenirNext-DemiBold", size: 22.0)!]
// To control navigation bar's translucency.
UINavigationBar.appearance().isTranslucent = false

Удачного кодирования!



15

SWIFT 4 - Плавный переход (лучшее решение):

Если вы переходите от контроллера навигации, и вам нужно установить другой цвет на контроллере навигации, который вы выдвинули, вы хотите использовать

override func willMove(toParentViewController parent: UIViewController?) {
    navigationController?.navigationBar.barTintColor = .white
    navigationController?.navigationBar.tintColor = Constants.AppColor
}

вместо того, чтобы поместить его в viewWillAppear, чтобы переход стал чище.

SWIFT 4.2

override func willMove(toParent parent: UIViewController?) {
    navigationController?.navigationBar.barTintColor = UIColor.black
    navigationController?.navigationBar.tintColor = UIColor.black
}

11

В Swift 4

Вы можете изменить цвет панели навигации. Просто используйте этот фрагмент кода нижеviewDidLoad()

Цвет панели навигации

self.navigationController?.navigationBar.barTintColor = UIColor.white

Цвет текста панели навигации

self.navigationController?.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.purple]

Для iOS 11 большой заголовок панели навигации , вы должны использовать largeTitleTextAttributesсвойство

self.navigationController?.navigationBar.largeTitleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.purple]

9

appearance()Функция не всегда работает для меня. Поэтому я предпочитаю создать объект NC и изменить его атрибуты.

var navBarColor = navigationController!.navigationBar
navBarColor.barTintColor =
    UIColor(red:  255/255.0, green: 0/255.0, blue: 0/255.0, alpha: 100.0/100.0)
navBarColor.titleTextAttributes =
    [NSForegroundColorAttributeName: UIColor.whiteColor()]

Также, если вы хотите добавить изображение вместо просто текста, это также работает

var imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 70, height: 70))
imageView.contentMode = .ScaleAspectFit

var image = UIImage(named: "logo")
imageView.image = image
navigationItem.titleView = imageView

таким образом я смог изменить цвет self.navigationController? .navigationBar.topItem? .title. Спасибо.
огужан


4

iOS 8 (Swift)

let font: UIFont = UIFont(name: "fontName", size: 17)   
let color = UIColor.backColor()
self.navigationController?.navigationBar.topItem?.backBarButtonItem?.setTitleTextAttributes([NSFontAttributeName: font,NSForegroundColorAttributeName: color], forState: .Normal)

4

Если вы настроили навигационный контроллер, вы можете использовать приведенный выше фрагмент кода. Так что в моем случае я использовал следующие фрагменты кода.

Swift 3.0, версия XCode 8.1

navigationController.navigationBar.barTintColor = UIColor.green

Текст навигационной панели:

navigationController.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.orange]

Это очень полезные разговоры.


4

Обновление Swift 4, iOS 12 и Xcode 10

Просто вставьте одну строку внутрь viewDidLoad()

navigationController?.navigationBar.barTintColor = UIColor.red

3

В Свифт 2

Для изменения цвета в панели навигации,

navigationController?.navigationBar.barTintColor = UIColor.whiteColor()

Для изменения цвета в панели навигации элемента,

navigationController?.navigationBar.tintColor = UIColor.blueColor()

или

navigationController!.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.blueColor()]

3

Свифт 3

UINavigationBar.appearance().barTintColor = UIColor(colorLiteralRed: 51/255, green: 90/255, blue: 149/255, alpha: 1)

Это установит цвет панели навигации как цвет панели Facebook :)


3

Swift 3 и Swift 4 совместимый Xcode 9

Лучшее решение для этого, чтобы сделать класс для общих панелей навигации

У меня есть 5 контроллеров, и название каждого контроллера меняется на оранжевый цвет. Поскольку у каждого контроллера есть 5 навигационных контроллеров, мне пришлось менять каждый цвет либо из инспектора, либо из кода.

Таким образом, я сделал класс вместо того, чтобы менять каждую панель навигации из кода, я просто назначил этот класс, и он работал на всех 5 способностях повторного использования кода контроллера. Вы просто должны назначить этот класс каждому контроллеру, и это все.

import UIKit

   class NabigationBar: UINavigationBar {
      required init?(coder aDecoder: NSCoder) {
       super.init(coder: aDecoder)
    commonFeatures()
 }

   func commonFeatures() {

    self.backgroundColor = UIColor.white;
      UINavigationBar.appearance().titleTextAttributes =     [NSAttributedStringKey.foregroundColor:ColorConstants.orangeTextColor]

 }


  }

2

iOS 10 Swift 3.0

Если вы не возражаете против использования быстрых фреймворков, используйте UINeraida, чтобы изменить фон навигации как UIColorили HexColorили UIImageи изменить текст кнопки навигации назад программно, полностью изменить цвет текста.

Для UINavigationBar

    neraida.navigation.background.color.hexColor("54ad00", isTranslucent: false, viewController: self)
    
    //Change navigation title, backbutton colour
    
    neraida.navigation.foreground.color.uiColor(UIColor.white, viewController: self)
    
    //Change navigation back button title programmatically
    
    neraida.navigation.foreground.backButtonTitle("Custom Title", ViewController: self)
    
    //Apply Background Image to the UINavigationBar
    
    neraida.navigation.background.image("background", edge: (0,0,0,0), barMetrics: .default, isTranslucent: false, viewController: self)

2

Свифт 3

Простой вкладыш, который вы можете использовать в ViewDidLoad()

//Change Color
    self.navigationController?.navigationBar.barTintColor = UIColor.red
//Change Text Color
    self.navigationController?.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.white]

2

Эта версия также удаляет теневую линию 1px под панелью навигации:

Swift 5: поместите это в свой AppDelegate didFinishLaunchingWithOptions

UINavigationBar.appearance().barTintColor = UIColor.black
UINavigationBar.appearance().tintColor = UIColor.white
UINavigationBar.appearance().titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
UINavigationBar.appearance().isTranslucent = false
UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .any, barMetrics: .default)
UINavigationBar.appearance().shadowImage = UIImage()

1

Я должен был сделать

UINavigationBar.appearance().tintColor = UIColor.whiteColor()
UINavigationBar.appearance().barStyle = .Black
UINavigationBar.appearance().backgroundColor = UIColor.blueColor()

в противном случае цвет фона не изменился бы


1

Сначала установите для свойства isTranslucent navigationBar значение false, чтобы получить нужный цвет. Затем измените цвет навигационной панели следующим образом:

@IBOutlet var NavigationBar: UINavigationBar!

NavigationBar.isTranslucent = false
NavigationBar.barTintColor = UIColor (red: 117/255, green: 23/255, blue: 49/255, alpha: 1.0)

1

Не забудьте установить состояние кнопки для .normal

extension UINavigationBar {

    func makeContent(color: UIColor) {
        let attributes: [NSAttributedString.Key: Any]? = [.foregroundColor: color]

        self.titleTextAttributes = attributes
        self.topItem?.leftBarButtonItem?.setTitleTextAttributes(attributes, for: .normal)
        self.topItem?.rightBarButtonItem?.setTitleTextAttributes(attributes, for: .normal)
    }
}

PS iOS 12, Xcode 10.1


1
Спасибо. Я искал часы для этого topItemрешения. Это разочаровывает количество изменений, которые Apple продолжает вносить в то, как стили применяются к навигации.
App Dev Guy

1

просто вызовите это расширение и передайте цвет, он автоматически изменит цвет навигационной панели

extension UINavigationController {

     func setNavigationBarColor(color : UIColor){
            self.navigationBar.barTintColor = color
        }
    }

в представлении didload или в представлении появится вызов

self.navigationController? .setNavigationBarColor (цвет: <# T ## UIColor #>)


1

Попробуйте это в AppDelegate:

//MARK:- ~~~~~~~~~~setupApplicationUIAppearance Method
func setupApplicationUIAppearance() {

    UIApplication.shared.statusBarView?.backgroundColor = UIColor.clear

    var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }

    UINavigationBar.appearance().tintColor = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)
    UINavigationBar.appearance().barTintColor =  UIColor.white
    UINavigationBar.appearance().isTranslucent = false

    let attributes: [NSAttributedString.Key: AnyObject]

    if DeviceType.IS_IPAD{
        attributes = [
            NSAttributedString.Key.foregroundColor: UIColor.white,
            NSAttributedString.Key.font: UIFont(name: "HelveticaNeue", size: 30)
            ] as [NSAttributedString.Key : AnyObject]
    }else{
        attributes = [
            NSAttributedString.Key.foregroundColor: UIColor.white
        ]
    }
    UINavigationBar.appearance().titleTextAttributes = attributes
}

iOS 13

func setupNavigationBar() {
    //        if #available(iOS 13, *) {
    //            let window = UIApplication.shared.windows.filter {$0.isKeyWindow}.first
    //            let statusBar = UIView(frame: window?.windowScene?.statusBarManager?.statusBarFrame ?? CGRect.zero)
    //            statusBar.backgroundColor = #colorLiteral(red: 0.2784313725, green: 0.4549019608, blue: 0.5921568627, alpha: 1) //UIColor.init(hexString: "#002856")
    //            //statusBar.tintColor = UIColor.init(hexString: "#002856")
    //            window?.addSubview(statusBar)
    //            UINavigationBar.appearance().tintColor = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)
    //            UINavigationBar.appearance().barTintColor = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)
    //            UINavigationBar.appearance().isTranslucent = false
    //            UINavigationBar.appearance().backgroundColor = #colorLiteral(red: 0.2784313725, green: 0.4549019608, blue: 0.5921568627, alpha: 1)
    //            UINavigationBar.appearance().titleTextAttributes = [NSAttributedString.Key.foregroundColor : UIColor.white]
    //        }
    //        else
    //        {
    UIApplication.shared.statusBarView?.backgroundColor = #colorLiteral(red: 0.2784313725, green: 0.4549019608, blue: 0.5921568627, alpha: 1)
    UINavigationBar.appearance().tintColor = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)
    UINavigationBar.appearance().barTintColor = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)
    UINavigationBar.appearance().isTranslucent = false
    UINavigationBar.appearance().backgroundColor = #colorLiteral(red: 0.2784313725, green: 0.4549019608, blue: 0.5921568627, alpha: 1)
    UINavigationBar.appearance().titleTextAttributes = [NSAttributedString.Key.foregroundColor : UIColor.white]
    //        }
}

расширения

extension UIApplication {

var statusBarView: UIView? {
    if responds(to: Selector(("statusBar"))) {
        return value(forKey: "statusBar") as? UIView
    }
    return nil
}}

1

Я пишу это для тех, у кого все еще есть проблемы с решениями здесь.

Я использую Xcode версии 11.4 (11E146). Тот, кто работает на меня:

navigationController?.navigationBar.barTintColor = UIColor.white
navigationController?.navigationBar.tintColor = UIColor.black

НО !, если вы установите barTintColor в раскадровке на любое другое значение, кроме «default», эти 2 строки кода не будут иметь никакого эффекта.

Поэтому будьте осторожны и верните значение по умолчанию barTintColor в раскадровке. О, Эппл ...


Все еще та же проблема, несмотря на изменение цвета оттенка по умолчанию :(
marika.daboja

@ marika.daboja Все ваши контроллеры навигации в раскадровке настроены на цвета по умолчанию?
Томас Кордоба

Привет, у меня есть только 1 контроллер навигации (плюс 2 контроллера табличного представления). Цвет панели оттенков панели управления навигацией установлен по умолчанию. Код, который я должен обновить, кажется, не влияет на него.
marika.daboja

@ marika.daboja убедитесь, что навигационный контроллер не ноль. И что вы поместили эти строки кода в viewDidLoad ()
Томас Кордоба

0

Добавьте эти строки в ваш AppDelegate внутри функции didFinishLaunchingWithOptions:

эта строка для фона панели навигации.

UINavigationBar.appearance().barTintColor = .orange

эта строка означает, что если значение is isTranslucent равно false, при навигации будет отображаться белый цвет.

UINavigationBar.appearance().tintColor = .white

эта строка для ваших текстов и значков на панели навигации

UINavigationBar.appearance().titleTextAttributes = [NSAttributedString.Key.foregroundColor: Styles.textFirstColor]

эта строка нам, чтобы все сводилось к вашей панели навигации.

UINavigationBar.appearance().isTranslucent = false
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.