Xcode 11.4. Navigation's Title Color film şeridinden SİYAH gitti


55

Yakın zamanda Xcode'umu 11.4 olarak güncelledim. Uygulamayı cihazda çalıştırdığımda, film şeridinden ayarlandığında tüm navigasyon öğemin başlıklarının tamamen siyahlaştığını fark ettim. resim açıklamasını buraya girin

Hiçbirini koddan değiştiremezsiniz, aşağıdaki kod satırı artık çalışmıyor

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

Sadece bazı iOS 13 öğelerini kullanarak çalışmasını sağlıyorum 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]
    }

Biri bana nedenini açıklayabilir mi ??? Bu çok önemli bir hata mı yoksa yeni bir gizli özellik mi?


3
Burada aynı sorun ve bunu düzeltmek için yapacak bir şey bulmak. Bence bu bir hata: /
Jordan Favray

Elma. Uggh. Gerçekten mi?
Daniel


bu Xcode Arayüz oluşturucu Hata Güncelleme XCode 11.4.1 için
NinjaDeveloper

Yanıtlar:



36

Bu benim için UINavigationBarAppearance kullanarak düzeltti: Uygulamanızın Gezinme Çubuğunu Özelleştirme

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

Not: Ben UINavigationController alt sınıfta ve bu viewWillAppear geçersiz kılma çağrıldı .

... veya uygulama genelinde AppDelegate için :

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 için, uygulama genelinde, Objective-C'de:

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

Teşekkür ederim, bu doğru bir cevap! , iOS 13'te Apple ekledi UINavigationBarAppearance()ve eski Xcode üzerinde hiçbir sebep olmadan buna bağlı değildik, ancak Xcode 11.4'ten beri kullanmalı UINavigationBarAppearance()veya Başlık rengi her zaman Siyah renk olacaktır.
Basil

appearance.largeTitleTextAttributesbüyük başlıklar için.
Skoua

Bu harika çalışıyor ve teşekkür ederim !, Bunu AppDelegate'ten evrensel olarak yapmak için yine de var mı?
slicerdicer

@slicerdicer - Evet! Örnek için güncellenmiş cevabıma bakın. Şerefe.
Stu Carney

1
@Richard - Objective-C'nin cevabını yeni ekledim. Üzgünüm, yorumunuzu bugüne kadar görmedim.
Stu Carney

14

Film şeridinde, Gezinti Denetleyiciniz için "Çubuk Tonu" nu "Varsayılan" değerine değiştirin, ardından kodunuzda normalde yaptığınız gibi değiştirebilirsiniz.


3
En iyi cevap. Gerçekten mi.
Vladimir Prigarin

2
Bu doğru yoldur
Hugo

1
En iyi anwer❗️ dönemi.
gölgeler

2
@ JCutting8 evet, bu doğru. Ancak Xcode 11.4 ile film şeridinde varsayılan rengi ayarlamazsanız, programlı olarak değiştirmek işe yaramaz. Bunun bir sorun olup olmadığını bilmiyorum.
gölgeler

1
Bu bir sihir!
ekashking

6

Bunun bir hata olup olmadığından emin değilim.

Düzeltme şeklimiz, "Durum Çubuğu Stili" ni proje ayarlarında koyu veya açık içeriğe ayarlamaktır. Bu, Durum Çubuğu metin rengini Açık veya Koyu modda olan aygıtlara göre belirlenmek yerine belirli bir şekilde zorlar.

Ayrıca, Info.plist'inizde "Denetleyici tabanlı durum çubuğu görünümünü görüntüle" değerini "HAYIR" olarak ayarlamanız gerekir. bu değer olmadan "Durum Çubuğu stili" geçersiz kılınır.

Ardından özel bir gezinme denetleyicisi oluşturun ve bunu film şeridinize uygulayın.

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

* Renkler açık bir şekilde çalıştıklarını görebilmeniz için ayarlanmıştır.

Renkleri ilk yükte ayarlanmadığı için ViewDidLoad yerine kodu ViewDidLoad'da ayarlamanın daha iyi olduğunu gördüm, sadece geriye dönüp yeniden yükledikten sonra.

Ayrıca bu sorunun bir NavBar "Bar Tonu" bağlı olabilir bulundu. ilk çözmeyi denediğimizde, "Çubuk Renk Tonu" nu varsayılan olarak ayarladık ve bu da hatayı giderdi. Ancak, NavBar arka plan rengini istediğimiz şekilde alamadık. Öykü tablolarımda, bu değeri sadece iyi bir ölçü için varsayılan olarak ayarladığınızdan emin oldum.

Umarım yardımcı olur


Bu işe yarıyor. Görünüşe göre sadece işe yaramayan küresel tarzı belirliyor.
Mongo

def elma ucunda bir böcek. yardımcı olamaz ama bir şey kırmak>. <
Michael McKenna


0

Stu Carney'nin 3/25'teki yanıtına benzer şekilde, birkaç uygulama detayı daha ekledim.

UINavigationController alt sınıfı oluşturun . ViewWillAppear'a aşağıdakileri ekleyin:

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

Ardından, tercih edilen statusBarStyle'ı geçersiz kılın :

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

Gezinme çubuğunu ve durum çubuğunu UISwitch IBAction veya seçici yönteminden olduğu gibi dinamik olarak güncellemek istiyorsanız, aşağıdakileri ekleyin:

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

Ayrıca, tüm gezinme çubuklarınızı ve çubuk düğmelerinizi IB'deki varsayılan renklere ayarladığınızdan emin olun. Xcode, IB renklerinin programlı olarak ayarlanan renkleri geçersiz kıldığı bir hataya sahip gibi görünüyor.


0

Benim durumumda, Xcode'u 11.3'ten 11.4'e yükselttikten sonra bu hata oluştu. Bu yüzden bir görüntüyü gezinme çubuğunda arka plan olarak ayarlamak için üflemek için kodumu değiştirmek zorundayım.

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()
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.