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

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
Джеф Аян
93

Очень легко настроить в раскадровке:

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

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

AlessandroDP
источник
Отлично, спасибо :)
Naresh Reddy M
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)
AiOsN
источник
он меняет цвет для всего приложения. Что делать, если мне нужно изменить его для конкретного экрана / конкретного 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
self.navigationController?.navigationBar.tintColor = UIColor.redColor()

Этот фрагмент делает магию. Вместо redColor измените его на ваше желание.

Суреш Кумар Дурайрадж
источник
6

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

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

UINavigationBar.appearance().tintColor = .white

}
M.Nadeeshan
источник
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

в использовании swift 2.0

self.navigationController!.navigationBar.tintColor = UIColor.whiteColor();
Риккардо Кароли
источник
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+

Yuchen
источник
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
}
yazh
источник
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;
Ertaky
источник
(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

tylerlantern
источник
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
Вайбхав Гайквад
источник