Xcode 11.4। नेविगेशन का शीर्षक रंग स्टोरीबोर्ड से BLACK गया


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
यहाँ एक ही समस्या है और मुझे यह सही करने के लिए कुछ नहीं करना है। मुझे लगता है कि यह एक बग है: /
जॉर्डन फेवरे

सेब। Uggh। वास्तव में?
डैनियल


यह Xcode इंटरफ़ेस बिल्डर बग अपडेट XCode से
11.4.1 तक

जवाबों:



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 के लिए, उद्देश्य-सी में, ऐप-वाइड:

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बड़े खिताब के लिए।
स्कौआ

यह बहुत अच्छा काम करता है और आपको धन्यवाद देता है!
स्लाइसरसाइड

@ स्लीकरडॉसर - हां! एक उदाहरण के लिए मेरा अद्यतन उत्तर देखें। चीयर्स।
स्टु कार्नी

1
@ रिचर्ड - मैंने सिर्फ ऑब्जेक्टिव-सी के लिए उत्तर जोड़ा है। क्षमा करें, मैंने आज तक आपकी टिप्पणी नहीं देखी।
स्टु कारनी

14

स्टोरीबोर्ड पर, आपके नेविगेशन नियंत्रक के लिए "बार टिंट" को उसके "डिफ़ॉल्ट" मान में बदल दें, फिर अपने कोड पर आप इसे बदल सकते हैं जैसा कि आप सामान्य रूप से करते हैं।


3
सबसे बढ़िया उत्तर। वास्तव में।
व्लादिमीर प्रागारिन

2
यह उचित तरीका है
ह्यूगो

1
सर्वश्रेष्ठ awer❗️ अवधि।
छायाश्री

2
@ JCutting8 हाँ, यह सही है। लेकिन Xcode 11.4 के साथ यदि आप स्टोरीबोर्ड में डिफ़ॉल्ट रंग सेट नहीं करते हैं, तो इसे प्रोग्रामेटिक रूप से बदलते हुए यह काम नहीं करता है। मुझे नहीं पता कि यह कोई मुद्दा है या नहीं।
शैडोशीप

1
यह एक जादू है!
ईकिंग

6

यकीन नहीं होता कि यह बग है या नहीं।

जिस तरह से हमने तय किया वह "स्टेटस बार स्टाइल" को प्रोजेक्ट सेटिंग में या तो डार्क या लाइट कंटेंट सेट करके है। यह लाइट या डार्क मोड में डिवाइस के आधार पर निर्धारित होने के बजाय स्टेटस बार टेक्स्ट कलर को एक निश्चित तरीके से बाध्य करेगा।

इसके अलावा, आपको अपने Info.plist में "NO-" के लिए "कंट्रोलर-आधारित स्थिति बार उपस्थिति" मान सेट करने की आवश्यकता है। उस मूल्य के बिना "स्टेटस बार स्टाइल" को ओवरराइड किया जाएगा।

अगला एक कस्टम नेविगेशन नियंत्रक बनाएं और इसे अपने स्टोरीबोर्ड में लागू करें।

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

* रंग निर्धारित किए जाते हैं ताकि आप उन्हें स्पष्ट रूप से काम करते देख सकें।

मैंने पाया कि ViewDidAppear के बजाय ViewDidLoad में कोड सेट करना बेहतर था क्योंकि मेरे रंग प्रारंभिक लोड पर सेट नहीं किए जा रहे थे, केवल वापस नेविगेट करने और पुनः लोड करने के बाद।

मैंने यह भी पाया कि यह मुद्दा एक NavBar के "बार टिंट" से जुड़ा हो सकता है। जब हम पहली बार इसे हल करने की कोशिश कर रहे थे, तो हमने "बार टिंट" को डिफ़ॉल्ट रूप से सेट किया और यह भी लगा कि त्रुटि भी हल हो गई है। हालाँकि, इसने इसे बनाया ताकि हम NavBar का बैकग्राउंड कलर नहीं पा सके। इसलिए मेरे स्टोरीबोर्ड में मैंने इस मान को केवल अच्छे उपाय के लिए डिफ़ॉल्ट रूप से सेट करना सुनिश्चित किया।

आशा है ये मदद करेगा


यह काम करता है। ऐसा लगता है जैसे यह सिर्फ वैश्विक शैली सेट कर रहा है जो काम नहीं करता है।
मानगो

सेब के अंत में एक बग को हराया। मदद नहीं कर सकता, लेकिन चीजों को तोड़ सकता
हूं

2

वर्कअराउंड की कोई आवश्यकता नहीं है। यह Xcode इंटरफ़ेस बिल्डर में एक बग है। Apple ने Xcode 11.4.1 के लिए अपडेट जारी किया

Apple डेवलपर रिलीज़ नोट्स से

इंटरफ़ेस बिल्डर

एक समस्या है कि कुछ UINavigationBar उपस्थिति गुण स्टोरीबोर्ड और XIB दस्तावेज़ों में सेट किए जाने पर Xcode 4.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]
}

तब ओवरराइड preferredStatusBarStyle :

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

यदि आप नेविगेशन बार और स्टेटस बार को गतिशील रूप से अपडेट करना चाहते हैं, जैसे UISwitch IBAction या चयनकर्ता विधि से, तो निम्न जोड़ें:

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

इसके अलावा, आईबी में डिफ़ॉल्ट रंगों के लिए अपने सभी नेविगेशन बार और बार बटन सेट करना सुनिश्चित करें। 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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.