Xcode 5.1 और iOS 7.1 में अपग्रेड करने के बाद सेगमेंट ट्रांजिशन के दौरान नेविगेशन बार पर गहरा छाया


91

जब मैं एक मास्टर - विस्तार नेविगेशन नियंत्रक में माता-पिता और बच्चे के नियंत्रकों के बीच आगे-पीछे नेविगेट कर रहा हूं, तो मुझे शीर्ष पर नेविगेशन बार के दाईं ओर एक अंधेरा छाया दिखाई देता है। Xcode 5.1 में अपग्रेड करने के बाद इसकी शुरुआत हुई। यह मोटा और विचलित करने वाला लगता है। मुझे इससे कैसे छुटकारा मिल सकता है?

जवाबों:


143
self.navigationController.view.backgroundColor = [UIColor whiteColor];

मैंने नेविगेशन कंट्रोलर के दृश्य की पृष्ठभूमि का रंग निर्धारित करके इस समस्या को हल किया।


यह उत्तर वास्तव में बहुत अच्छा है। किसी कारण से इंटरफ़ेस बिल्डर आपको अपने नेविगेशन नियंत्रक के दृश्य तक पहुंचने की अनुमति नहीं देता है, लेकिन ऐसा लगता है कि कोई darkColorदृश्य अभी भी है और इस समस्या का कारण बनता है।
superarts.org

1
यह एक महान जवाब है क्योंकि यह भी नेविगेशन नियंत्रक से होकर आने वाले बदसूरत काले खंड को नहीं दिखाते हुए बार को पारभासी रहने देता है। बस इच्छा थी कि स्टोरीबोर्ड में इसे स्थापित करने का एक तरीका था।
डाइमिगेल

बिल्कुल सही। समय-समय पर मैं इसके बारे में सोचता हूं और अन्य उत्तरों के बारे में थोड़ा निराश हो जाता हूं जो कि नेविगेशन बार पारदर्शिता को बंद करने का सुझाव देते हैं, क्योंकि मूल रूप से वे इस समस्या को एक सुविधा को अक्षम करके हल कर रहे हैं, जो यह उत्तर वास्तविक सुधार को इंगित करता है। बहुत बुरा यह व्यवहार Xcode 7 / iOS 9. में ही रहता है
superarts.org

1
क्षमा करें, मैंने इस उत्तर को अस्वीकार कर दिया क्योंकि खिड़की की पृष्ठभूमि इस समस्या का मूल कारण नहीं है। कृपया मेरा स्क्रीनशॉट संलग्न देखें: imgur.com/a/SH5Dp आप पाएंगे कि समस्या अभी भी मौजूद है, डार्क शेड को केवल एक सफेद में बदल दिया गया है, मुझे लगता है कि विवरण नियंत्रक को 'क्लिप्ड' या किसी भी तरह से मिला दिया गया है, इसे NavBar के तहत कुछ भी आकर्षित नहीं करता है। ।
मरियटकु

1
tabBarController? .view.backgroundColor = रूट नियंत्रक UITabBarController है, तो UIColor.white incase।
विशाल सिंह

53
self.navigationController.navigationBar.translucent = NO; 

ठीक कर दिया


आपने इसे कहां रखा है?
जोरायर

मास्टर व्यू कंट्रोलर के ViewDidLoad विधि में
Nihat

viewDidAppear में जोड़ें
अब्दुल वहीद

मुझे लगता है कि यह वास्तव में सही उत्तर है। navigationController.view.backgroundColor = .whiteआईओएस 11 अब और काम नहीं करता है
AnBisw

1
@Annjawn, navigationController.view.backgroundColor = .white iOS 12 पर काम करता है। नेविगेशन बार से को हटाने की जरूरत होने पर स्थिति में इस्तेमाल नहीं किया जा सकता है, लेकिन ब्लैक शैडो नहीं है।
एलेक्स मोटर

38

nonamelive का उत्तर एकदम सही है। इंटरफ़ेस बिल्डर और स्टिल KEEP TRANSLUCENCY में एक ही चीज़ को प्राप्त करने के लिए , नेविगेशन नियंत्रक का चयन करें और एक उपयोगकर्ता परिभाषित रनटाइम विशेषता सेट करें view.backgroundColorजैसा कि स्क्रीनशॉट में दिखाया गया है (पहचान निरीक्षक में)। सभी नेविगेशन नियंत्रकों के लिए दोहराएं जो इस समस्या को दिखाते हैं।

ऐसा लगता है कि यह पूरी समस्या इसलिए है क्योंकि UINavigationController का काला रंग (या वास्तव में, कोई रंग नहीं) उस समय के माध्यम से लीक हो रहा है जब CoreGraphics ने इसे एनीमेशन शुरू किया। इसलिए, इसे सफेद पर सेट करने से रोका जा सकेगा।

पहचान निरीक्षक -> उपयोगकर्ता परिभाषित रनटाइम गुण


1
मैं इस दृष्टिकोण को पसंद करता हूं, इंटरफ़ेस बिल्डर को यूआई सामान जितना संभव हो सके।
DazChong

iOS 8.4 ने मदद नहीं की
मक्सिम नियाज़ेव

3
पूरी तरह से Xcode 8.3.3 के साथ काम करता है। बस फिर से जोर देने के लिए, UINavigationControllerव्यू-कंट्रोलर पर सेट होना चाहिए ।
जंगलेव जुएल

मेरे पास एक टैबकॉन में एक नाविक था और दोनों पट्टियों (ऊपर और नीचे) पर छाया देखा गया था, जब नौसेना के कुलपतियों में से एक पर "खाल नीचे पट्टी पर धक्का" का उपयोग कर रहा था। नौसिखिया पर सफेद पृष्ठभूमि सेट करना दोनों छाया तय करता है। धन्यवाद!
nh32rg

6

यह एक बग प्रतीत होता है जिसे iOS 7.1 में पेश किया गया था। मेरे मामले में यह सीधे नेविगेशन बार के नीचे एक यूआईटूलबार के कारण होता है। अंधेरे छाया भी पारभासी टैब बार में दिखाई देती है।

छाया UIToolbar की पृष्ठभूमि दृश्य के कारण लगती है। अब मैं टूलबार के साथ व्यू कंट्रोलर में इस वर्कअराउंड का उपयोग करता हूं, जो ट्रांज़िशन के दौरान टूलबार की पृष्ठभूमि दृश्य को छुपाता है:

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    UIView *toolbarBackgroundView = [self.toolbar findViewRecursively:^BOOL(UIView *subview, BOOL *stop) {
        BOOL isToolbarBackgroundView = ([subview isKindOfClass:[UIImageView class]]
                                        && [NSStringFromClass(subview.class) isEqualToString:@"_UIToolbarBackground"]);
        if (isToolbarBackgroundView) {
            *stop = YES;
        }
        return (! isToolbarBackgroundView);
    }];
    if (toolbarBackgroundView) {
        // fade toolbar background view back in
        [UIView animateWithDuration:0.1f animations:^{
            toolbarBackgroundView.alpha = 1.0f;
        }];
    }
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];

    UIView *toolbarBackgroundView = [self.toolbar findViewRecursively:^BOOL(UIView *subview, BOOL *stop) {
        BOOL isToolbarBackgroundView = ([subview isKindOfClass:[UIImageView class]]
                                        && [NSStringFromClass(subview.class) isEqualToString:@"_UIToolbarBackground"]);
        if (isToolbarBackgroundView) {
            *stop = YES;
        }
        return (! isToolbarBackgroundView);
    }];
    if (toolbarBackgroundView) {
        // hide toolbar background view
        toolbarBackgroundView.alpha = 0.0f;
    }
}

इसके लिए कोड है [UIView findViewRecursively:]

@interface UIView (FindSubview)

- (UIView*)findViewRecursively:(BOOL(^)(UIView* subview, BOOL* stop))recurse;

@end

@implementation UIView (FindSubview)

- (UIView*)findViewRecursively:(BOOL(^)(UIView* subview, BOOL* stop))recurse {
    for (UIView* subview in self.subviews) {
        BOOL stop = NO;
        if (recurse(subview, &stop)) {
            UIView* view = [subview findViewRecursively:recurse];
            if (view) return view;
        } else if (stop) {
            return subview;
        }
    }
    return nil;
}

@end

मैंने यह राडार दायर किया: http://openradar.appspot.com/16418845


2
यदि आप एक पारभासी नेविगेशन बार नहीं चाहते हैं तो आपका समाधान ठीक है।
टॉम

पाने का एक आसान तरीका है backgroundView[self.toolbar valueForKey:@"_backgroundView"]। कृपया ध्यान दें कि यह एक निजी एपीआई है, लेकिन मुझे लगता है कि आप Apple द्वारा नहीं पकड़े जाएंगे क्योंकि _backgroundViewयह केवल एक सामान्य नाम है।
गैर

इस जवाब ने मुझे वह कर दिया जो मुझे करने की जरूरत थी। मेरे मामले में यह इंटरफ़ेस बिल्डर में यूआईटूलबार पर पारभासी विकल्प को अनचेक करने जैसा सरल था।
ग्रेग डब्ल्यू

4

यह किसी भी बार (TabBar या ToolBar) के साथ होता है जो पारभासी है।
तो इसे ठीक करने का एक तरीका _tabBar.translucent = NO;(मेरे मामले में) सेट करना है । यह नेविगेशन बार को पारभासी छोड़ते समय शीर्ष नेविगेशन बार के नीचे अवांछित छाया को रोकता है। दुर्भाग्य से नीचे की पट्टी अब पारभासी नहीं है।

इसे पारभासी में वापस सेट किया जा सकता है, लेकिन यह सब पूरे पुशिंग एनीमेशन के समाप्त होने के बाद होना है, इसलिए इस संपत्ति को स्विच करना अच्छी तरह से ध्यान देने योग्य है।

मामले में, हालांकि नीचे की पट्टी को भी पारभासी होना पड़ता है और मैं नहीं चाहता कि उपयोगकर्ता उस परिवर्तन को देखें जिसे मैंने इसे निम्नलिखित के साथ हल किया था:

/*  create a simple quick animation of the bottom bar
    just before pushing the new controller */
[UIView animateWithDuration:0.1
                 animations:^{
                     _tabBar.barTintColor = [UIColor colorWithWhite:0.97254901960784 alpha:1.0]; // this is the closest color for my case
                     _tabBar.translucent = NO;
                 } completion:^(BOOL finished) {
                     /* now when the animation that makes the bar not translucent
                        is finished we can push the new controller
                        the controller is instantiated before the animation code */
                     [self.navigationController pushViewController:controller animated:YES];
                 }];

तो viewDidAppear:मैं बस में है कि वापस reverts:

[UIView animateWithDuration:0.1
             animations:^{
                     _tabBar.barTintColor = nil;
                     _tabBar.translucent = YES;
                 }];

विशेष रूप से दिखने में बस थोड़ा सा बदलाव है लेकिन यह मुश्किल से ध्यान देने योग्य है और यह नेविगेशन बार के नीचे छाया होने से बेहतर है।

आशा है कि यह दूसरों को बार पारभासी रखने में मदद करेगा जब तक कि Apple इस व्यवहार को ठीक नहीं करता है क्योंकि सलाखों को कुछ मामलों में छिपाया जाता है, जबकि इसके विपरीत अन्य पदों में विशेष रूप से इसके लिए सुझाव दिया गया था। UITabBar


मैं @ manmal के समाधान को अपनाकर इस समस्या को ठीक करने में सक्षम था - view.backgroundColorस्टोरीबोर्ड में आपके UITabBarController के लिए रनटाइम विशेषता को परिभाषित करें , और इसे एक सफेद रंग में सेट करें।
jamesk

4

यह स्विफ्ट में मेरे लिए काम करता है

में AppDelegateपर didFinishLaunchingWithOptionsविधि, मैं इस सेट करें:

UIApplication.shared.windows.first?.backgroundColor = .white

4

पर मेरे लिए यह काम करता है आईओएस 13 दोनों के साथ प्रकाश और अंधेरे विषयों और भी बड़े iOS संस्करण पर।

application(didFinishLaunchingWithOptions)विधि में AppDelegate के लिए निम्नलिखित कोड जोड़ें :

if #available(iOS 13.0, *) {
    window?.backgroundColor = UIColor.systemBackground
} else {
    window?.backgroundColor = UIColor.white
}

मैंने भी इस पद्धति को आज़माया था, लेकिन डिफ़ॉल्ट मोड में दृश्य नियंत्रक पेश करते समय मुझे एक समस्या आती है। फिर आपको काले रंग के बजाय खिड़की की सफेद पृष्ठभूमि दिखाई देगी। यह अजीब लग रहा है। क्या आप इस स्थिति से उबरने के लिए कोई सुझाव दे सकते हैं
वरुण v नायर

3

यहाँ मेरी भिन्नता है ... इसे टॉम के उत्तर की तुलना में बहुत कम कोड की आवश्यकता है, और अधिक कुशल है। यह है IF आप एक पारभासी नेविगेशन बार चाहते हैं, और उस छाया समस्या को भी ठीक करना चाहते हैं।

स्रोत ViewController (कि नेविगेशन नियंत्रक में एम्बेडेड है) ...

- (void)viewDidAppear:(BOOL)animated
{
     self.navigationController.navigationBar.translucent = YES;
}

तथा

 - (void)viewWillDisappear:(BOOL)animated
 {
     self.navigationController.navigationBar.translucent = NO;
 }

परिणाम वही है जो टॉम करता है (नेत्रहीन, अंतिम उपयोगकर्ता के लिए), और लागू करना आसान है। उम्मीद है की यह मदद करेगा...


3
self.navigationController!.navigationBar.translucent = false;

यह मेरे लिए काम करता है यह फ़ंक्शन के अंदर रखता है जहां आप नए ViewController को धक्का देते हैं


पागल, लेकिन सभी जवाबों के बीच, इसे अगले वीसी को धकेलने वाले समारोह में रखने का विचार था!
Coltuxumab

3

निम्नलिखित भी काम करता है और नेविगेशन बार को पारदर्शी छोड़ देता है:

[UIApplication sharedApplication].keyWindow.backgroundColor = [UIColor whiteColor];


1

हालांकि यह स्टॉक iOS कार्यान्वयन के समान नहीं है, यह समस्या को ठीक करने का एक अच्छा तरीका है:

- (void)viewWillAppear:(BOOL)animated {
    [UIView animateWithDuration:0.35f animations:^{
        self.tabBarController.tabBar.alpha = 1.0f;
    }];
}

- (void)viewWillDisappear:(BOOL)animated {
    [UIView animateWithDuration:0.35f animations:^{
        self.tabBarController.tabBar.alpha = 0.0f;
    }];
}

आपको टैब बार का एक अच्छा फीका-इन / फीका-आउट एनीमेशन मिलेगा। रूट में कोड जोड़ें UIViewController


-1

या यदि आप इंटरफ़ेस बिल्डर का उपयोग कर रहे हैं, तो आप बस अपने नेविगेशन नियंत्रक से नेविगेशन बार का चयन कर सकते हैं और उस अजीब प्रभाव से छुटकारा पाने के लिए सहायक निरीक्षक में स्टाइल और बार टिंट के बीच पारदर्शी चेकबॉक्स को अनचेक कर सकते हैं -

निरीक्षक

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.