Панель навигации, цветовой тон и цвет текста заголовка в iOS 8


177

Фоновый текст в строке состояния по-прежнему черный. Как мне изменить цвет на белый?

// io8, swift, Xcode 6.0.1 
override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationController?.navigationBar.barTintColor = UIColor.blackColor()
    self.navigationController?.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.orangeColor()]

}

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

Ответы:


312

Во AppDelegate.swift, во application(_:didFinishLaunchingWithOptions:)я положил следующее:

UINavigationBar.appearance().barTintColor = UIColor(red: 234.0/255.0, green: 46.0/255.0, blue: 73.0/255.0, alpha: 1.0)
UINavigationBar.appearance().tintColor = UIColor.white
UINavigationBar.appearance().titleTextAttributes = [NSAttributedString.Key.foregroundColor : UIColor.white]

(Для Swift 4 или более ранней версии используйте NSAttributedStringKeyвместо NSAttributedString.Key)

Ибо titleTextAttributes, документы говорят:

Вы можете указать шрифт, цвет текста, цвет тени текста и смещение тени текста для заголовка в словаре текстовых атрибутов.


6
Что делать, если у нас есть несколько панелей навигации?
Саммит

6
tintColor не работает для Xcode 7.3.1. Текст все еще черный.
triiiiista

1
В Xcode 8.2 titleTextAttributes не выполняет автозаполнение, но работает.
okysabeni

barTintColor все еще необходим? удаление этой строки все еще работает
rgkobashi

122

Мне нравится ответ Алекса. Если вы хотите попробовать что-то быстрое, ViewControllerубедитесь, что вы используете

viewWillAppear()
override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    var nav = self.navigationController?.navigationBar
    nav?.barStyle = UIBarStyle.Black
    nav?.tintColor = UIColor.white
    nav?.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.orange]
    //nav?.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.orange] // swift 4.2
}

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


Но я использую ISO 8.1
Saorikido

1
почему viewWillAppear ()? Я делаю это в viewDidLoad, и он отлично работает.
Адам Джонс

4
Потому что каждый раз, когда вы просматриваете UIView, вы хотите, чтобы он был установлен. Если вы установите в viewDidLoad (), скажем, в представлении UITabBar, перейдите на другую вкладку, где она снова установлена, а затем вернитесь, она будет перезаписана, так как исходное представление было загружено только один раз.
FractalDoctor

2
Обновление для swift 4 - NSForegroundColorAttributeNameтеперь должно бытьNSAttributedStringKey.foregroundColor
Alan Scarpa

3
Обновление для Swift 4.2: NSAttributedString.Key.foregroundColorвместоNSForegroundColorAttributeName
Stephane Paquet

81

Для того, чтобы изменить цвет повсеместно, этот код должен сидеть в NavigationController«S viewDidLoadфункции:

class NavigationController: UINavigationController, UIViewControllerTransitioningDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        // Status bar white font
        self.navigationBar.barStyle = UIBarStyle.Black
        self.navigationBar.tintColor = UIColor.whiteColor()
    }
}

Для того, чтобы изменить его на ViewControllerвы должны ссылаться на NavigationControllerот ViewControllerи писать подобные строки в том , что ViewController«s viewWillAppearфункции.


Как переопределить NavigationController для использования этих методов?
AG1

Вы не переопределяете NavigationController, вы просто изменяете его в функции ViewDidLoad. Я обновил свой ответ выше.
Алекс

1
Таким образом, разработчик просто должен добавить NavigationController.swift в рабочую область? Если так, то это аккуратно!
AG1

5
@ AG1 Это неверно, просто добавить новый файл NavigationController.swift недостаточно, вам нужно подключить свой Navigation Controller в раскадровке к этому файлу в Identity Inspector, поскольку по умолчанию он будет использовать Generic UINavigationController.
kakubei

2
Вы также можете просто сделать все это в раскадровке без необходимости создания собственного контроллера навигации. Свойства Bar Tine и Style находятся справа под инспектором Атрибутов.
Markymark

31

Swift 5

self.navigationController?.navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]

Swift 4

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

2
Я получаю: Тип «NSAttributedStringKey» (он же «NSString») не имеет члена «foregroundColor»
Альфи

Пожалуйста , используйте ниже код для последней версии Xcode 10 и Свифт 4.2 self.navigationController .navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]?
Bhavsang Jam

16

Для работы в target-c я должен вставить следующие строки viewWillAppearв мой CustomViewController.

[self.navigationController.navigationBar setBarTintColor:[UIColor whiteColor]];
[self.navigationController.navigationBar setTranslucent:NO];

Для Swift2.x это работает:

self.navigationController?.navigationBar.barTintColor = UIColor.redColor()

Для Swift3.x это работает:

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

Но когда я возвращаюсь к другому контроллеру вида, цвет также изменился. Любая идея о том, как это предотвратить. Я хочу, чтобы мой основной viewcontroller был одного цвета, а остальные - другого.
user3163404

1
Я думаю, что вы также должны установить цвет в вашем новом контроллере вида.
Нико Клаусницер,

13

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

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

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

    @IBInspectable var tintColor: UIColor? {
        set {
            navigationBar.tintColor = newValue
        }
        get {
            guard  let color = navigationBar.tintColor else { return nil }
            return color
        }
    }

    @IBInspectable var titleColor: UIColor? {
        set {
            guard let color = newValue else { return }
            navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: color]
        }
        get {
            return navigationBar.titleTextAttributes?["NSForegroundColorAttributeName"] as? UIColor
        }
    }
}

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

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


7

Если вы хотите установить цвет оттенка и цвет панели для всего приложения, следующий код можно добавить в AppDelegate.swift в

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.

    var navigationBarAppearace = UINavigationBar.appearance()

    navigationBarAppearace.tintColor = UIColor(red:1.00, green:1.00, blue:1.00, alpha:1.0)
    navigationBarAppearace.barTintColor = UIColor(red:0.76, green:0.40, blue:0.40, alpha:1.0)
    navigationBarAppearace.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.white]
    return true
`

Навигация по барам TintColor и tintColor установлена


6

Обновлено с Swift 4

override func viewDidLoad() {
    super.viewDidLoad()
        self.navigationController?.navigationBar.tintColor = UIColor.blue
        self.navigationController?.navigationBar.barStyle = UIBarStyle.black
}

6

В Swift5 и Xcode 10

self.navigationItem.title = "your name"
let textAttributes = [NSAttributedStringKey.foregroundColor:UIColor.white]
navigationController?.navigationBar.titleTextAttributes = textAttributes

Хотя этот фрагмент кода может решить вопрос, в том числе объяснение действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин, по которым вы предлагаете код.
31

4

Swift 4.2 версия ответа Альберта

UINavigationBar.appearance().barTintColor = UIColor(red: 234.0/255.0, green: 46.0/255.0, blue: 73.0/255.0, alpha: 1.0)
UINavigationBar.appearance().tintColor = UIColor.white
UINavigationBar.appearance().titleTextAttributes = [.foregroundColor : UIColor.white]

Мне очень понравилось, как вы добавили этот ответ. .barTintColor сейчас не вариант. Вы имеете в виду .backgroundColor?
Бен

4

Установка цвета текста заголовка навигационной панели на белый в Swift версии 4.2:

navigationController?.navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]

3

Swift 4

override func viewDidLoad() {
    super.viewDidLoad()

    navigationController?.navigationBar.barTintColor = UIColor.orange
    navigationController?.navigationBar.tintColor = UIColor.white
    navigationController?.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.white]
}

3

Swift 4.1

Добавьте функцию к viewDidLoad

override func viewDidLoad() {
  super.viewDidLoad()

  setup()
}   

В setup()функцию добавьте:

func setup() {

        navigationController?.navigationBar.prefersLargeTitles = true
        navigationController?.navigationBar.barStyle = .blackOpaque
        navigationItem.title = "YOUR_TITLE_HERE"
        navigationController?.navigationBar.barTintColor = .black
        let attributes = [NSAttributedStringKey.foregroundColor: UIColor.white]
        navigationController?.navigationBar.largeTitleTextAttributes = attributes
    }

1

Для нестандартного цвета TitleText at NavigationBar, вот простой и краткий код для Swift 3:

UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName : UIColor.white]

или

navigationController?.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName :UIColor.white]

1

в Swift 4.2

var nav = self.navigationController?.navigationBar
nav?.barStyle = UIBarStyle.Black
nav?.tintColor = UIColor.white
nav?.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.orange]

1

Свифт вверх через Свифт 3.2 (не Свифт 4.0)

    self.navigationController?.navigationItem.largeTitleDisplayMode = .always
    self.navigationController?.navigationBar.prefersLargeTitles = true
    self.navigationController?.navigationBar.largeTitleTextAttributes = [NSForegroundColorAttributeName: UIColor.white]

    // unconfirmed but I assume this works:
    self.navigationController?.navigationBar.barTintColor = UIColor.white
    self.navigationController?.navigationBar.barStyle = UIBarStyle.black

0

В Swift 3 это работает:

navigationController?.navigationBar.barTintColor = UIColor.white
navigationController?.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.blue]

0

Swift 5.1

Только скопируйте и вставьте ViewDidLoad()и измените его и размер, как вам нужно. Перед копированием и вставкой добавьте панель навигации в верхней части экрана.

navigationController?.navigationBar.titleTextAttributes = [ NSAttributedString.Key.font: UIFont(name: "TitilliumWeb-Bold.ttf", size: 16.0)!, NSAttributedString.Key.foregroundColor: UIColor.white]

Если это не сработает, вы можете изменить только цвет текста.

navigationController?.navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.