Изменить цвет кнопки «Назад» на панели навигации


194

Я пытаюсь изменить цвет кнопки «Настройки» на белый, но не могу изменить его.

Я пробовал оба из них:

navigationItem.leftBarButtonItem?.tintColor = UIColor.whiteColor()
navigationItem.backBarButtonItem?.tintColor = UIColor.whiteColor()

но без изменений, это все равно выглядит так:

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

Как мне сделать эту кнопку белой?

Ответы:


284

Вы можете изменить цвет глобального оттенка в вашей раскадровке, нажав на пустое место на доске и выбрав на правой панели инструментов «Показать инспектор файлов», и вы увидите в нижней части панели инструментов параметр «Глобальный оттенок».

Опция Global Tint в раскадровке


7
Воу .. Хорошая находка !. ты знаешь как это сделать программно?
Пол Лен

10
Отличная находка, но изменение глобального оттенка на белый (согласно исходному вопросу) также изменит такие вещи, как индикаторы раскрытия информации о табличном представлении, на белый, что сделает их невидимыми в рассматриваемой таблице.
Майк Фишер

1
Добавление к проблемам Майка: этот элемент управления также делает все ваши текстовые кнопки этим цветом, поэтому вам придется либо установить для них цвет вручную (т. Е. Явно не использовать цвета по умолчанию), либо просто использовать другой метод.
Сирены

4
Хотя это быстрое и простое решение, оно приводит к другим проблемам, если цвет белый / соответствует фону. Если у вас есть текстовые поля, это делает курсор незаметным, что делает его похожим на пользователя, как будто он не может писать в текстовом поле, потому что курсор не виден.
Хосе Рамирес

5
@PaulLehn Для этого программно, AppDelegate.swift > application(application:didFinishLaunchingWithOptions:)вы можете написать:self.window!.tintColor = .yourColor
mmika1000

206

Этот код меняет цвет стрелки

self.navigationController.navigationBar.tintColor = UIColor.whiteColor();

Если это не работает, используйте код ниже:

self.navigationBar.barStyle = UIBarStyle.Black
self.navigationBar.tintColor = UIColor.whiteColor()

Свифт 3 ноты

UIColor.whiteColor() и аналогичные были упрощены до UIColor.white

Кроме того, многие ранее неявные дополнительные функции были изменены на явные, поэтому вам может потребоваться:

self.navigationController?.navigationBar =

7
self.navigationController?.navigationBar.tintColor = UIColor.whiteColor()работал для меня (Swift 2.2)
Майк Фишер

self.navigationBar.barStyle = UIBarStyle.Black self.navigationBar.tintColor = UIColor.whiteColor () работал для меня (Swift 3)
Ajay.km

Можете ли вы объяснить, почему использовать UIBarStyle.Black?
mmika1000

Пожалуйста, обновите: self.navigationController? .NavigationBar.tintColor =
mohonish

1
она изменяет только стрелку назад текст все еще остается тем же самым в Xcode 11
Джеф Аян


56

Вы должны использовать это:

navigationController?.navigationBar.barTintColor = .purple
navigationController?.navigationBar.tintColor = .white

Это сделало кнопку белой, но цвет фона стал намного светлее. Знаете ли вы, как придать фону бар снова полный цвет?
Брэндон Эванс

Это правильный ответ. Это сделает панель фиолетовой, установив barTintColor и кнопки заголовка / панели белым цветом.
zirinisp

36

стриж

 override func viewDidLoad() {
     super.viewDidLoad()

 self.navigationController?.navigationBar.tintColor = UIColor.white
 }

1
Используйте в быстрой 3.
Дипак Тагадия

также скажите мне, какую быструю версию вы можете использовать?
Дипак Тагадия

А какой класс / файл / vc в этом коде написать в проекте?
Дипак Тагадия

В начале функции setCloseButton (), которая вызывается по viewWillAppear.
Джайпракаш Дубей

записать в файл NextViewController.swift, а также записать в viewDidLoad ().
Дипак Тагадия

20

Вы можете использовать как этот. Поместите это внутрь AppDelegate.swift.

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

        UINavigationBar.appearance().translucent = false
        UINavigationBar.appearance().barTintColor = UIColor(rgba: "#2c8eb5")
        UINavigationBar.appearance().tintColor = UIColor.whiteColor()
        UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName:UIColor.whiteColor()]

        return true
    }

20

Swift 4.2

Изменить полную тему приложения

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

        UINavigationBar.appearance().tintColor = .white

        return true
    }

Изменить конкретный контроллер

let navController = UINavigationController.init(rootViewController: yourViewController) 
navController.navigationBar.tintColor = .red

present(navController, animated: true, completion: nil)

он меняет цвет для всего приложения. Что делать, если мне нужно изменить его для конкретного экрана / конкретного UINavigationController?
Вячеслав Герчиков

@VyachaslavGerchicov выше ответ для полной темы приложения, если вы хотите изменить конкретный контроллер. Сделайте что-то вроде этого: let navController = UINavigationController.init (rootViewController: yourViewController) navController.navigationBar.tintColor = .red
AiOsN

Если вы используете iOS 13, вы больше не используете didFinishLaunchingWithOptions, он был перемещен в SceneDelegate.
JBarros35

15

В Swift3 , чтобы установить кнопку Назад в red.

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

это установит панель навигации, а не элемент кнопки панели
carlodonz

1
Да, это был вопрос.
Винсент

«Изменить цвет кнопки« Назад » на навигационной панели»
carlodonz

Это был единственный метод, который работал для меня. Что-то кажется сломанным с реализацией Apple прямо сейчас ...
Дейв Y

13

В Swift 4 вы можете решить эту проблему, используя:

let navStyles = UINavigationBar.appearance()
// This will set the color of the text for the back buttons.
navStyles.tintColor = .white
// This will set the background color for navBar
navStyles.barTintColor = .black

8

Swift 3

Наиболее одобренный ответ не является правильным для Swift 3.

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

Правильный код для изменения цвета:

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

Если вы хотите изменить цвет, измените UIColor.white выше на желаемый цвет


Это был единственный метод, который работал для меня. Что-то кажется сломанным с реализацией Apple прямо сейчас ...
Дейв Y

7

Все настройки ответов UINavigationBar.appearance().tintColorпротиворечат документации Apple в UIAppearance.h.

Примечание для iOS7: на iOS7 tintColorсвойство переместилось в UIView, и теперь имеет особое наследуемое поведение, описанное в UIView.h. Это унаследованное поведение может вступать в конфликт с прокси-сервером внешнего вида и поэтому tintColorне разрешено с прокси-сервером внешнего вида.

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

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

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

Обратите внимание, что UIBarButtonItemэто не подкласс, UIViewа скорее NSObject. Так что его tintColorсобственность не наследуется tintColorот UIView.

К сожалению, UIBarButtonItem.tintColorэто не аннотировано UI_APPEARANCE_SELECTOR- но это мне кажется ошибкой документации. Ответ от Apple Engineering на этом радаре гласит, что он поддерживается.


UINavigationBar.appearance (). LargeTitleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white] // также
Гильерме


6

Используйте этот код в AppDelegateклассе, внутри didFinishLaunchingWithOptions.

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

UINavigationBar.appearance().tintColor = .white

}

4

Давайте попробуем этот код:

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

    let navigationBarAppearace = UINavigationBar.appearance()
    navigationBarAppearace.tintColor = UIColor.whiteColor()  // Back buttons and such
    navigationBarAppearace.barTintColor = UIColor.purpleColor()  // Bar's background color
    navigationBarAppearace.titleTextAttributes = [NSForegroundColorAttributeName:UIColor.whiteColor()]  // Title's text color

    self.window?.backgroundColor = UIColor.whiteColor()
    return true
}

Большое спасибо, сэр
Arpit B Parekh


4

Если у вас уже есть кнопка «Назад» в вашем контроллере представления «Настройки» и вы хотите изменить цвет кнопки «Назад» в контроллере представления «Информация об оплате» на что-то другое, вы можете сделать это в «Настройках», чтобы подготовить контроллер к следующей передаче, как это :

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "YourPaymentInformationSegue"
    {
        //Make the back button for "Payment Information" gray:
        self.navigationItem.backBarButtonItem?.tintColor = UIColor.gray               
    }
}

3
self.navigationController.navigationBar.tintColor = [UIColor whiteColor];

Это работает для меня, iOS 9.0+


2

Добавьте следующий код в didFinishLaunchingWithOptions функции в AppDelegate.swift

var navigationBarAppearace = UINavigationBar.appearance()

navigationBarAppearace.tintColor = uicolorFromHex(0xffffff) // White color
navigationBarAppearace.barTintColor = uicolorFromHex(0x034517) // Green shade

// change navigation item title color
navigationBarAppearace.titleTextAttributes =[NSForegroundColorAttributeName:UIColor.whiteColor()]

Этот код дает мне следующую ошибку: «Использование неразрешенного идентификатора« uicolorFromHex »» Может кто-нибудь помочь мне решить эту проблему?
jonathan3087

вероятно, расширение для UIColor. Вы можете искать в stackoverflow, как создать расширение.
KvdLingen

2

Для Swift 2.0: Чтобы изменить цвет оттенка навигационной панели , текст заголовка и цвет оттенка кнопки «Назад» изменились с помощью следующего в AppDelegate.swift

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

  // Override point for customization after application launch.


    //Navigation bar tint color change

    UINavigationBar.appearance().barTintColor = UIColor(red: 42/255.0, green: 140/255.0, blue: 166/255.0, alpha: 0.5)

    //Back button tint color change

    UINavigationBar.appearance().barStyle = UIBarStyle.Default
    UINavigationBar.appearance().tintColor =  UIColor(red: 204/255.0, green: 255/255.0, blue: 204/255.0, alpha: 1)

    //Navigation Menu font tint color change

    UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName: UIColor(red: 204/255.0, green: 255/255.0, blue: 204/255.0, alpha: 1), NSFontAttributeName: UIFont(name: "OpenSans-Bold", size: 25)!]//UIColor(red: 42/255.0, green: 140/255.0, blue: 166/255.0, alpha: 1.0)

    UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.LightContent


    return true
}

2

Не знаю, почему никто не упомянул об этом ... но я делал именно то, что вы делали в моем viewDidLoad... и это не сработало. Затем я поместил свой код в, viewWillAppearи все заработало.

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

По сути, переход на сам класс с использованием appearance()подобен глобальному изменению всех экземпляров этого представления в вашем приложении. Подробнее смотрите здесь


1

У вас есть один выбор - спрятать кнопку «Назад» и сделать это самостоятельно. Затем установите его цвет.

Я это сделал:

self.navigationItem.setHidesBackButton(true, animated: true)
let backbtn = UIBarButtonItem(title: "Back", style:UIBarButtonItemStyle.Plain, target: self, action: "backTapped:")
self.navigationItem.leftBarButtonItem = backbtn
self.navigationItem.leftBarButtonItem?.tintColor = UIColor.grayColor()

1
Вопрос был конкретно о стилизации левого элемента навигации, и это наиболее близко к прямому ответу на вопрос.
ремесло

0

Это будет решено с помощью этой строки в - (void) viewDidLoad:

self.navigationItem.backBarButtonItem.tintColor = UIColor.whiteColor;

(lldb) p self.navigationItem.backBarButtonItem (UIBarButtonItem *) $9 = nil (lldb)
dengApro

0

Вы должны добавить эту строку

 self.navigationController?.navigationBar.topItem?.backBarButtonItem?.tintColor = .black

0

Я предпочитаю настраиваемый NavigationController, а не настройку глобального пользовательского интерфейса или использование ViewController.

Вот мое решение


class AppNavigationController : UINavigationController {

  override func viewDidLoad() {
    super.viewDidLoad()
    self.delegate = self
  }

  override func viewWillAppear(_ animated: Bool) {

  }

}
extension AppNavigationController : UINavigationControllerDelegate {

  func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
    let backButtonItem = UIBarButtonItem(
      title: "   ",
      style: UIBarButtonItem.Style.plain,
      target: nil,
      action: nil)
    backButtonItem.tintColor = UIColor.gray
    viewController.navigationItem.backBarButtonItem = backButtonItem
  }

  func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool) {

  }

}

Также вам не нужно связываться с Apple Api, такими как EKEventEditViewController , PickerViewController и т. Д., Если вы используете глобальные настройки, такие какUIBarButtonItem.appearance().tintColor = .white


0
    self.navigationController?.navigationBar.tintColor = UIColor.black // to change the all text color in navigation bar or navigation 
    self.navigationController?.navigationBar.barTintColor = UIColor.white // change the navigation background color
    self.navigationController?.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName:UIColor.black] // To change only navigation bar title text color
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.