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

240

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

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

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

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

user3746428
источник

Ответы:

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 на выбранный вами цвет.

trumpeter201
источник
Большое спасибо! Я был недалеко от того, что я пытался, но у меня не все было в порядке.
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

Keenle
источник
Итак, как бы я использовал это, чтобы изменить цвет панели навигации для всего приложения? На данный момент у меня просто есть: 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
  }
}
Fangming
источник
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

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

Гаурав Сингла
источник
16
UINavigationBar.appearance().barTintColor

работал на меня

Asbar
источник
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
GuiSoySauce
источник
таким образом я смог изменить цвет self.navigationController? .navigationBar.topItem? .title. Спасибо.
огужан
8

Используйте API внешнего вида и цвет barTintColor.

UINavigationBar.appearance().barTintColor = UIColor.greenColor()
Майкл Петерсон
источник
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
Xcodian Solangi
источник
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]
Codetard
источник
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
Али Кадери
источник