Xcode 11.4. Warna Judul Navigasi menjadi HITAM dari storyboard

55

Saya baru-baru ini memperbarui Xcode saya ke 11,4. Ketika saya menjalankan aplikasi di perangkat, saya perhatikan bahwa semua judul item navigasi saya menjadi hitam ketika diatur dari storyboard. masukkan deskripsi gambar di sini

Anda tidak dapat mengubah keduanya dari kode, baris kode berikut tidak berfungsi lagi

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

Saya hanya membuatnya berfungsi menggunakan beberapa barang 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]
    }

Adakah yang bisa menjelaskan mengapa? Ini adalah bug penting, atau beberapa fitur tersembunyi baru?

Tudor Popa
sumber
3
Masalah yang sama di sini dan saya menemukan tidak ada yang bisa dilakukan untuk memperbaikinya. Saya pikir itu bug: /
Jordan Favray
Apel. Uggh. Betulkah?
Daniel
coba yang ini stackoverflow.com/a/61003557/3887987
Amrit Tiwari
itu adalah pembaruan Bug pembangun Antarmuka Xcode Xcode ke
11.4.1

Jawaban:

36

Ini memperbaikinya bagi saya, sebagai gantinya menggunakan UINavigationBarAppearance, dari: Menyesuaikan Bilah Navigasi Aplikasi Anda

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]
}

Catatan: Saya subkelas UINavigationController , dan ini dipanggil dari override viewWillAppear .

... atau untuk AppDelegate , seluruh aplikasi:

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
}

... untuk AppDelegate, seluruh aplikasi, di 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];
}
Stu Carney
sumber
Terima kasih, ini jawaban yang benar! , di iOS 13 Apple menambahkan UINavigationBarAppearance()dan tanpa alasan pada Xcode lama kami tidak perlu bergantung padanya, tapi karena Xcode 11.4 harus digunakan UINavigationBarAppearance()atau Judul warna akan selalu warna Hitam.
Basil
appearance.largeTitleTextAttributesuntuk judul besar.
Skoua
Ini bekerja dengan baik dan terima kasih!, Adakah yang melakukan hal ini secara universal dari AppDelegate?
slicerdicer
@slicerdicer - Yap! Lihat jawaban saya yang diperbarui, misalnya. Bersulang.
Stu Carney
1
@ Richard - Saya baru saja menambahkan jawaban untuk Objective-C. Maaf, saya tidak melihat komentar Anda sampai hari ini.
Stu Carney
14

Di storyboard, untuk Pengontrol Navigasi Anda, ubah "Bar Tint" ke nilai "Default" -nya, lalu pada kode Anda, Anda dapat mengubahnya seperti biasa.

Sudhakar Varma
sumber
3
Jawaban Terbaik. Betulkah.
Vladimir Prigarin
2
Ini adalah cara yang tepat
Hugo
1
Periode jawaban terbaik.
shadowsheep
2
@ JCutting8 ya, itu benar. Tetapi dengan Xcode 11.4 jika Anda tidak menetapkan warna default di storyboard, mengubahnya secara pemrograman tidak berfungsi. Saya tidak tahu apakah ini masalah atau tidak.
shadowsheep
1
Ini adalah Sihir!
ekashking
6

Tidak yakin apakah itu bug atau tidak.

Cara kami memperbaikinya adalah dengan mengatur "Status Bar Style" ke konten gelap atau terang dalam pengaturan proyek. Ini akan memaksa warna teks Status Bar dengan cara tertentu daripada ditentukan berdasarkan pada perangkat yang berada dalam mode Terang atau Gelap.

Selain itu, Anda perlu mengatur nilai "Lihat tampilan bilah status berbasis pengontrol" menjadi "TIDAK" di Info.plist Anda. tanpa nilai itu "gaya Status Bar" akan diganti.

Selanjutnya buat pengontrol navigasi khusus dan implementasikan di storyboard Anda.

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]
    }
  }
}

* Warna diatur sehingga Anda dapat melihatnya bekerja dengan jelas.

Saya menemukan itu lebih baik untuk mengatur kode di ViewDidLoad daripada ViewDidAppear karena warna saya tidak diatur pada beban awal, hanya setelah menavigasi kembali dan memuat ulang.

Saya juga menemukan bahwa masalah ini mungkin terkait dengan "Bar Tint" dari NavBar. ketika kami pertama kali mencoba untuk menyelesaikannya, kami mengatur "Bar Tint" ke default dan itu tampaknya menyelesaikan kesalahan juga. Namun, itu membuatnya sehingga kami tidak bisa mendapatkan warna latar belakang NavBar seperti yang kami inginkan. Jadi di storyboard saya, saya memastikan untuk menetapkan nilai ini ke default hanya untuk ukuran yang baik.

Semoga ini bisa membantu

jameseronious
sumber
Ini berhasil. Sepertinya itu hanya pengaturan gaya global yang tidak berfungsi.
Mongo
def bug di ujung apel. mau tak mau harus merusak barang>. <
Michael McKenna
2

tidak perlu untuk workaround.it adalah bug di Xcode Interface Builder. Pembaruan rilis Apple untuk Xcode 11.4.1

dari catatan rilis pengembang Apple

Pembuat Antarmuka

Memperbaiki masalah yang menyebabkan beberapa properti penampilan UINavigationBar yang diatur dalam storyboard dan dokumen XIB diabaikan ketika membangun dengan Xcode 11.4. (60883063) (FB7639654)

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

Pengembang Ninja
sumber
0

Mirip dengan respons Stu Carney pada 3/25, saya menambahkan beberapa detail implementasi lagi.

Buat subkelas dari UINavigationController . Tambahkan yang berikut ini ke viewWillAppear:

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]
}

Kemudian timpaStatusBarStyle yang disukai :

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

Jika Anda ingin memperbarui bilah navigasi dan bilah status secara dinamis, seperti dari UISwitch IBAction atau metode pemilih, tambahkan berikut ini:

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

Juga, pastikan untuk mengatur semua bilah navigasi dan tombol bilah ke warna default di IB. Xcode tampaknya memiliki bug di mana warna IB menimpa warna yang diatur secara terprogram.

Josh R
sumber
0

Dalam kasus saya, setelah saya memutakhirkan Xcode dari 11,3 ke 11,4 bug ini terjadi. Jadi saya harus mengubah kode saya untuk meniup untuk mengatur gambar sebagai latar belakang di bilah navigasi.

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()
}
Reza Dehnavi
sumber