Xcode 11.4. Колір заголовка навігації ЧЕРНИЙ із розгортки


55

Я нещодавно оновив свій Xcode до 11.4. Коли я запускаю додаток на пристрої, я помітив, що всі заголовки мого елемента навігації стали повністю чорними під час налаштування з розгортки. введіть тут опис зображення

Ви не можете змінити ні з коду, наступний рядок коду більше не працює

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

Я змушую його працювати лише за допомогою iOS 13 продуктів UINavigationBarAppearance

@available(iOS 13.0, *)
    private func setupNavigationBar() {
        let app = UINavigationBarAppearance()
        app.titleTextAttributes = [.foregroundColor: UIColor.white]
        app.backgroundColor = Constants.Color.barColor
        self.navigationController?.navigationBar.compactAppearance = app
        self.navigationController?.navigationBar.standardAppearance = app
        self.navigationController?.navigationBar.scrollEdgeAppearance = app

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

Може хтось мені пояснить, чому ??? Це вирішальна помилка чи якась нова прихована функція?


3
Тут же проблема, і я не знаходжу нічого для того, щоб виправити це. Я думаю, що це помилка: /
Jordan Favray

Apple. Фугу. Дійсно?
Даніель


це Xcode Interface builder Оновлення помилок XCode до 11.4.1
NinjaDeveloper

Відповіді:



36

Це виправлено для мене, використовуючи UINavigationBarAppearance замість цього: Настроювання навігаційної панелі вашого додатка

if #available(iOS 13.0, *) {
    let appearance = UINavigationBarAppearance()
    appearance.configureWithOpaqueBackground()
    appearance.backgroundColor = UIColor.black
    appearance.titleTextAttributes = [.foregroundColor: UIColor.white] // With a red background, make the title more readable.
    self.navigationBar.standardAppearance = appearance
    self.navigationBar.scrollEdgeAppearance = appearance
    self.navigationBar.compactAppearance = appearance // For iPhone small navigation bar in landscape.
} else {
    self.navigationBar.barTintColor = UIColor.black
    self.navigationBar.tintColor = UIColor.white
    self.navigationBar.titleTextAttributes = [.foregroundColor: UIColor.white]
}

Примітка: Я підкласи UINavigationController , і це називалося з відключенням viewWillAppear .

... або для AppDelegate у всьому додатку:

if #available(iOS 13.0, *) {
    let appearance = UINavigationBarAppearance()
    appearance.configureWithOpaqueBackground()
    appearance.backgroundColor = UIColor.black
    appearance.titleTextAttributes = [
        NSAttributedStringKey.foregroundColor: UIColor.white
    ]

    let buttonAppearance = UIBarButtonItemAppearance()
    buttonAppearance.normal.titleTextAttributes = [.foregroundColor: UIColor.white]
    appearance.buttonAppearance = buttonAppearance

    UINavigationBar.appearance().standardAppearance = appearance
    UINavigationBar.appearance().scrollEdgeAppearance = appearance
    UINavigationBar.appearance().compactAppearance = appearance

    UIBarButtonItem.appearance().tintColor = UIColor.white
} else {
    UINavigationBar.appearance().barTintColor = UIColor.black
    UINavigationBar.appearance().titleTextAttributes = [
        NSAttributedStringKey.foregroundColor: UIColor.white
    ]
    UINavigationBar.appearance().tintColor = UIColor.white

    UIBarButtonItem.appearance().tintColor = UIColor.white
}

... для AppDelegate, у всьому додатку, в Objective-C:

if (@available(iOS 13, *)) {
    UINavigationBarAppearance *appearance = [[UINavigationBarAppearance alloc] init];
    [appearance configureWithOpaqueBackground];
    appearance.backgroundColor = UIColor.whiteColor;
    appearance.titleTextAttributes = titleAttributes;

    UIBarButtonItemAppearance *buttonAppearance = [[UIBarButtonItemAppearance alloc] init];
    buttonAppearance.normal.titleTextAttributes = barButtonItemAttributes;
    appearance.buttonAppearance = buttonAppearance;

    UINavigationBar.appearance.standardAppearance = appearance;
    UINavigationBar.appearance.scrollEdgeAppearance = appearance;
    UINavigationBar.appearance.compactAppearance = appearance;

    [[UINavigationBar appearance] setTintColor:UIColor.blackColor];
} else {
    [[UINavigationBar appearance] setBarTintColor:UIColor.whiteColor];
    [[UINavigationBar appearance] setTintColor:UIColor.blackColor];
    [[UINavigationBar appearance] setTranslucent:false];
    [[UINavigationBar appearance] setTitleTextAttributes: titleAttributes];
    [[UIBarButtonItem appearance] setTitleTextAttributes:barButtonItemAttributes forState:UIControlStateNormal];
}

Дякую, це правильна відповідь! , на iOS 13 додано Apple, UINavigationBarAppearance()і без жодної причини на старий Xcode ми не готові були залежати від нього, але оскільки Xcode 11.4 він повинен використовувати, UINavigationBarAppearance()або колір заголовка завжди буде чорним кольором.
Василь

appearance.largeTitleTextAttributesдля великих назв.
Skoua

Це чудово працює і дякую !, Чи є все-таки зробити це універсально з AppDelegate?
slicerdicer

@slicerdicer - Так! Дивіться, наприклад, мою оновлену відповідь. Ура.
Стю Карні

1
@Richard - Я щойно додав відповідь для Objective-C. Вибачте, я не бачив ваш коментар до сьогодні.
Стю Карні

14

На аркуші розкадрування для вашого навігаційного контролера змініть "Відтінок смуги" на значення "За замовчуванням", а потім у своєму коді ви можете змінити його, як зазвичай.


3
Найкраща відповідь. Дійсно.
Володимир Пригарін

2
Це правильний шлях
Уго

1
Найкращий період ".
тінь

2
@ JCutting8 так, це правильно. Але з Xcode 11.4, якщо ви не встановите колір за замовчуванням на дошці даних, змінивши його програмно, він не працює. Я не знаю, це проблема чи ні.
тінь

1
Це магія!
екшакінг

6

Не впевнений, це помилка чи ні.

Ми вирішили це шляхом встановлення "Стилю рядка стану" на темний або світлий вміст у налаштуваннях проекту. Це змусить колір тексту рядка стану певним чином, а не визначатись на основі пристроїв, що знаходяться в режимі світлого або темного.

Крім того, вам потрібно встановити значення "Перегляд зовнішнього вигляду рядка стану на основі контролера" на "НІ" у вашому Info.plist. без цього значення "Стиль рядка стану" буде замінено.

Далі створіть користувальницький навігаційний контролер та втіліть його у ваші дошки.

class CustomNavigationController: UINavigationController {

 override func viewDidLoad() {
    super.viewDidLoad()
    setNavBar()
 }

 func setNavBar() {
    if #available(iOS 13.0, *) {
        let appearance = UINavigationBarAppearance()
        appearance.configureWithOpaqueBackground()
        appearance.backgroundColor = UIColor.blue
        appearance.titleTextAttributes = [.foregroundColor: UIColor.yellow]
        self.navigationBar.standardAppearance = appearance
        self.navigationBar.scrollEdgeAppearance = appearance
        self.navigationBar.compactAppearance = appearance
    } else {
        self.navigationBar.barTintColor = UIColor.blue
        self.navigationBar.titleTextAttributes = [.foregroundColor: UIColor.yellow]
    }
  }
}

* Кольори встановлені, щоб ви могли чітко бачити їх роботу.

Я виявив, що краще встановити код у ViewDidLoad, а не ViewDidAppear, оскільки мої кольори не встановлювалися під час початкового завантаження, лише після навігації назад та перезавантаження.

Я також виявив, що ця проблема може бути пов’язана з "Барним відтінком" NavBar. коли ми вперше намагалися вирішити цю проблему, ми встановили "Відтінок бар" за замовчуванням, і це, здавалося, вирішило помилку. Однак це зробило так, що ми не змогли отримати колір тла NavBar того, чого хотіли. Тож у своїх розповідях я переконався встановити це значення за замовчуванням лише для гарної міри.

Сподіваюся, це допомагає


Це справді працює. Здається, це лише встановлення глобального стилю, який не працює.
Монго

визначити помилку на кінці яблука. не можу не зламати речі>. <
Майкл Маккенна

2

немає потреби в workaround.it - ​​це помилка в Xcode Interface Builder. Оновлення версії Apple для Xcode 11.4.1

від нотаток до випуску розробника Apple

Інтерфейс Builder

Виправлена ​​проблема, яка спричинила ігнорування деяких властивостей зовнішнього вигляду UINavigationBar, встановлених у табло та документах XIB, під час створення з Xcode 11.4. (60883063) (FB7639654)

https://developer.apple.com/documentation/xcode_release_notes/xcode_11_4_1_release_notes


0

Як і у відповіді Стю Карні 3/25, я додав ще декілька деталей щодо імплементації.

Створіть підклас UINavigationController . Додайте наступне для переглядуWillAppear:

let isDarkMode = UserDefaults.standard.bool(forKey: "DarkMode")
let titleColor: UIColor = isDarkMode ? .white : .black
let navBarColor: UIColor = isDarkMode ? .black : .white
let tintColor: UIColor = isDarkMode ? .yellow : .red  //back button text and arrow color, as well as right bar button item

if #available(iOS 13.0, *) {
    let appearance = UINavigationBarAppearance()
    appearance.configureWithOpaqueBackground()
    appearance.backgroundColor = navBarColor
    appearance.titleTextAttributes = [.foregroundColor: titleColor]
    appearance.largeTitleTextAttributes = [.foregroundColor: titleColor]

    self.navigationBar.standardAppearance = appearance
    self.navigationBar.scrollEdgeAppearance = appearance
    self.navigationBar.compactAppearance = appearance // For iPhone small navigation bar in landscape.

    self.navigationBar.tintColor = tintColor //changes back button text and arrow color, as well as right bar button item
} else {
    self.navigationBar.barTintColor = navBarColor
    self.navigationBar.tintColor = tintColor
    self.navigationBar.titleTextAttributes = [.foregroundColor: titleColor]
    self.navigationBar.largeTitleTextAttributes = [.foregroundColor: titleColor]
}

Потім переосмислите перевагуStatusBarStyle :

override var preferredStatusBarStyle: UIStatusBarStyle {
    let isDarkMode = UserDefaults.standard.bool(forKey: "DarkMode")
    return isDarkMode ? .lightContent : .default
}

Якщо ви хочете динамічно оновлювати панель навігації та рядок стану, як-от за допомогою IBAction або методу вибору UISwitch, додайте наступне:

navigationController?.loadView()
navigationController?.topViewController?.setNeedsStatusBarAppearanceUpdate()

Також не забудьте встановити всі кольори навігації та кнопки смуги кольори за замовчуванням у IB. Здається, що в Xcode є помилка, коли кольори IB перекривають кольори, встановлені програмно.


0

У моєму випадку після оновлення Xcode з 11.3 до 11.4 ця помилка сталася. Тому я повинен змінити свій код, щоб він відображався, щоб встановити зображення як фон на панелі навігації.

if #available(iOS 13.0, *) {
    let appearance = UINavigationBarAppearance()
    appearance.configureWithOpaqueBackground()
    let backgroundImage = UIImage(named: "{NAVBAR_IMAGE_NAME}")?.resizableImage(withCapInsets: UIEdgeInsets.zero, resizingMode: .stretch)
    appearance.backgroundImage = backgroundImage
    self.navigationController?.navigationBar.compactAppearance = appearance
    self.navigationController?.navigationBar.standardAppearance = appearance
    self.navigationController?.navigationBar.scrollEdgeAppearance = appearance        
} else {
    self.navigationController?.navigationBar.barTintColor = Utils.themeColor
    let backgroundImage = UIImage(named: "{NAVBAR_IMAGE_NAME}")?.resizableImage(withCapInsets: UIEdgeInsets.zero, resizingMode: .stretch)
    self.navigationController?.navigationBar.setBackgroundImage(backgroundImage, for: .default)
    self.navigationController?.navigationBar.shadowImage = UIImage()
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.