it-swarm.com.ru

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

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

Благодарю.

198
user3746428

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

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

427
trumpeter201

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

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

81
Keenle
    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 в своем коде.

48
Mohit tomar

Обновлено для 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

44
Jamil Hasnine Tamim

В 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 и использовать массив "availableThemes", чтобы позволить пользователю изменить темуЦвет.

Прекрасная вещь в этом заключается в том, что вы можете использовать одну ссылку во всем приложении для каждого цвета, и она будет обновляться в зависимости от выбранной пользователем "Темы", а без нее по умолчанию будет использоваться 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) } ...
25
David West

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

С помощью 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
        }
    }
}

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

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
  }
}
17
Fangming
UINavigationBar.appearance().barTintColor

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

15
Asbar

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's translucency.
UINavigationBar.appearance().isTranslucent = false

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

11
Gaurav Singla

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

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

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

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

9
RickS

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

UINavigationBar.appearance().barTintColor = UIColor.greenColor()
8
Michael Peterson

Функция 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
8
GuiSoySauce

В 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]
7
Vinoth Vino

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

Swift 3.0, версия XCode 8.1

navigationController.navigationBar.barTintColor = UIColor.green

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

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

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

4
Bogdan Dimitrov Filov

Swift 4, iOS 12 и Xcode 10 Update

Просто поместите одну строку внутри viewDidLoad()

navigationController?.navigationBar.barTintColor = UIColor.red
4
Xcodian Solangi

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
Long Pham

Свифт 3

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

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

3
Sazzad Hissain Khan

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]

 }


  }
3
Ourang-Zeb Khan

В Swift 2

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

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

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

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

или же

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

iOS 10 Swift 3.0

Если вы не возражаете против использования рамок Swift, то используйте нас INeraida , чтобы изменить фон навигации на 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
user7304558

Swift

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

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

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

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

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

1
Guilherme Carvalho

Сначала установите для свойства 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
Nupur Sharma

Обязательно установите состояние кнопки для .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)
    }
}

P.S. iOS 12, Xcode 10.1

0
Mazen Kasser