Изменение цвета панели навигации в Swift
Я использую Picker View, чтобы пользователь мог выбрать цветную тему для всего приложения. Я планирую изменить цвет панели навигации, фона и, возможно, панели вкладок (если это возможно). Я изучал, как это сделать, но не могу найти примеры Swift. Может ли кто-нибудь, пожалуйста, привести пример кода, который мне нужно будет использовать для изменения цвета панели навигации и цвета текста панели навигации? (The Picker View настроен, я просто ищу код для изменения цветов пользовательского интерфейса)
Спасибо.
Ответы
Ответ 1
Панель навигации:
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 на выбранный вами цвет.
Ответ 2
Вот некоторые очень простые настройки внешнего вида, которые можно применить в приложении:
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();
Подробнее о API UIAppearance
в Swift вы можете прочитать здесь: https://developer.apple.com/documentation/uikit/uiappearance
Ответ 3
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
в свой код.
Ответ 4
Обновлено для Swift 3, 4 и 4.2
// 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
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
Ответ 5
Внутри 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 и содержать структуру стиля с цветами и шрифтами и т.д. Затем вы можете добавить tableView/pickerView в любой ViewController и использовать массив доступных массивов разрешить пользователю изменять themeColor.
Прекрасная вещь об этом - вы можете использовать одну ссылку во всем своем приложении для каждого цвета, и она будет обновляться на основе пользователя, выбранного "Тема", и без него по умолчанию используется тема1():
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) } ...
Ответ 6
Сделать это на раскадровке (инспектор интерфейса Builder)
С помощью IBDesignable
мы можем добавить дополнительные опции в IBDesignable
Interface Builder для 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
}
}
}
Затем просто установите атрибуты для контроллера навигации на раскадровке.
![enter image description here]()
Этот подход также может использоваться для управления цветом текста навигационной панели из раскадровки:
@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
}
}
Ответ 7
UINavigationBar.appearance().barTintColor
работал у меня
Ответ 8
Swift 4:
Совершенно рабочий код, чтобы изменить внешний вид навигационной панели на уровне приложения.
![enter image description here]()
// 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 translucency.
UINavigationBar.appearance().isTranslucent = false
Счастливое кодирование!
Ответ 9
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
}
Ответ 10
В 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]
Ответ 11
Используйте API внешнего вида и цвет barTintColor.
UINavigationBar.appearance().barTintColor = UIColor.greenColor()
Ответ 12
Функция appearance() не всегда работает для меня. Поэтому я предпочитаю создавать объект ЧПУ и изменять его атрибуты.
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
Ответ 13
iOS 8 (быстрый)
let font: UIFont = UIFont(name: "fontName", size: 17)
let color = UIColor.backColor()
self.navigationController?.navigationBar.topItem?.backBarButtonItem?.setTitleTextAttributes([NSFontAttributeName: font,NSForegroundColorAttributeName: color], forState: .Normal)
Ответ 14
Если вы настроили навигационный контроллер, вы можете использовать фрагмент кода выше.
Поэтому в моем случае я использовал следующие фрагменты кода.
Swift 3.0, версия XCode 8.1
navigationController.navigationBar.barTintColor = UIColor.green
Текст панели навигации:
navigationController.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.orange]
Это очень полезные беседы.
Ответ 15
Обновление Swift 4, iOS 12 и Xcode 10
Просто поместите одну строку внутри viewDidLoad()
navigationController?.navigationBar.barTintColor = UIColor.red
Ответ 16
В Swift 2
Для изменения цвета в панели навигации
navigationController?.navigationBar.barTintColor = UIColor.whiteColor()
Чтобы изменить цвет в панели навигации элемента,
navigationController?.navigationBar.tintColor = UIColor.blueColor()
или
navigationController!.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.blueColor()]
Ответ 17
Swift 3
UINavigationBar.appearance().barTintColor = UIColor(colorLiteralRed: 51/255, green: 90/255, blue: 149/255, alpha: 1)
Это установит цвет вашей панели навигации, как цвет панели Facebook:)
Ответ 18
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]
}
}
Ответ 19
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)
Ответ 20
Swift 3
Простой один вкладыш, который вы можете использовать в ViewDidLoad()
//Change Color
self.navigationController?.navigationBar.barTintColor = UIColor.red
//Change Text Color
self.navigationController?.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.white]
Ответ 21
Мне пришлось делать
UINavigationBar.appearance().tintColor = UIColor.whiteColor()
UINavigationBar.appearance().barStyle = .Black
UINavigationBar.appearance().backgroundColor = UIColor.blueColor()
иначе цвет фона не изменился бы
Ответ 22
Сначала установите для свойства isTranslucent свойство navigationBar значение false, чтобы получить желаемый цвет. Затем измените цвет navigationBar следующим образом:
@IBOutlet var NavigationBar: UINavigationBar!
NavigationBar.isTranslucent = false
NavigationBar.barTintColor = UIColor (red: 117/255, green: 23/255, blue: 49/255, alpha: 1.0)
Ответ 23
Не забудьте установить состояние кнопки для .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
Ответ 24
Попробуйте это в 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
}
Ответ 25
Добавьте эти строки в ваш AppDelegate внутри функции didFinishLaunchingWithOptions:
эта строка предназначена для фона панели навигации.
UINavigationBar.appearance().barTintColor = .orange
эта строка означает, что если значение not isTranslucent равно false, при навигации будет отображаться белый цвет.
UINavigationBar.appearance().tintColor = .white
эта строка предназначена для ваших текстов и значков на панели навигации
UINavigationBar.appearance().titleTextAttributes = [NSAttributedString.Key.foregroundColor: Styles.textFirstColor]
эта строка нам, чтобы все сводилось к вашей панели навигации.
UINavigationBar.appearance().isTranslucent = false