कैसे नेविगेशन की सीमा को हटाने के लिए तेजी से?


131

मैं भाग्य के बिना नेविगेशनबार्स सीमा को हटाने की कोशिश कर रहा हूं। मैंने शोध किया है और लोगों को यह बताने के लिए छायावाद और बैकग्राउंड को शून्य करने के लिए कहा गया है, लेकिन यह मेरे मामले में काम नहीं करता है।

मेरा कोड

    self.navigationController?.navigationBar.barTintColor = UIColor(rgba: "#4a5866")
    self.navigationController?.navigationBar.setBackgroundImage(UIImage(named: ""), forBarMetrics: UIBarMetrics.Default)
    self.navigationController?.navigationBar.shadowImage = UIImage(named: "")

उदाहरण:

यहाँ छवि विवरण दर्ज करें

जवाबों:


309

मुसीबत इन दो पंक्तियों के साथ है:

self.navigationController?.navigationBar.setBackgroundImage(UIImage(named: ""), forBarMetrics: UIBarMetrics.Default)
self.navigationController?.navigationBar.shadowImage = UIImage(named: "")

चूंकि आपके पास बिना नाम वाली छवि नहीं है, UIImage(named: "")रिटर्न nil, जिसका अर्थ है डिफ़ॉल्ट व्यवहार में किक:

जब गैर-शून्य, डिफ़ॉल्ट छाया छवि के बजाय दिखाने के लिए एक कस्टम छाया छवि। दिखाई जाने वाली एक कस्टम छाया के लिए, एक कस्टम बैकग्राउंड इमेज को भी सेट करना होगा -setBackgroundImage: forBarMetrics: (यदि डिफ़ॉल्ट बैकग्राउंड इमेज का उपयोग किया जाता है, तो डिफ़ॉल्ट शैडो इमेज का उपयोग किया जाएगा)।

आपको वास्तव में खाली छवि की आवश्यकता है, इसलिए बस इसके साथ आरंभ करें UIImage():

self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
self.navigationController?.navigationBar.shadowImage = UIImage()

2
यह जवाब वास्तव में काम करता है। क्योंकि यदि स्वीकृत उत्तर (कोड) का उपयोग करते हैं, तो इसका टूलबार का चित्र हटा दें।
सर्गेई कसीसुक

1
यह स्वीकृत उत्तर होना चाहिए। UINavigationBar.appearance ()
Heinrisch

1
यह स्विफ्ट 3 के लिए स्वीकृत उत्तर होना चाहिए। स्वीकृत उत्तर मेरे लिए स्विफ्ट 2 में काम किया, लेकिन स्विफ्ट 3 में नहीं
कॉलिनमास्टर्स

1
swift3 के लिए आप थोड़ा अलग तरह से लिखना चाहिए: self.navigationController .navigationBar.setBackgroundImage (UIImage (), के लिए: UIBarMetrics.default)? self.navigationController .navigationBar.shadowImage = UIImage ()
चेतन Dobariya

5
यह विधि iOS 11 में बड़े शीर्षक के साथ संघर्ष करती है
स्टीफनके

54

स्विफ्ट 4 और स्विफ्ट 5

सीमा को हटाना:

self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for:.default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.layoutIfNeeded()

सीमा बहाल:

self.navigationController?.navigationBar.setBackgroundImage(nil, for:.default)
self.navigationController?.navigationBar.shadowImage = nil
self.navigationController?.navigationBar.layoutIfNeeded()

2
सही उत्तर :)
PJR

क्या हमें यहां लेआउट की आवश्यकता है?
korgx9

1
हाँ korgx9, हमें इसकी आवश्यकता है। अन्यथा यह अगले ड्रा तक रंग नहीं बदलेगा।
सज्जाद हिसैन खान

37

यह छाया की छवि को पूरी तरह से हटा देगा

for parent in self.navigationController!.navigationBar.subviews {
 for childView in parent.subviews {
     if(childView is UIImageView) {
         childView.removeFromSuperview()
     }
 }
}

1
क्या आप विस्तृत कर सकते हैं?
केमेक्सनर

1
मेरे लिए भी यह समाधान काम करता है, जबकि @Nate Cook का जवाब काम नहीं करता। : एस
लुका दावानोज़ो

2
पवित्र शीश !! सभी खोज के बाद, यह केवल एक ही चीज़ है जिसने काम किया है।
तुआन अन्ह वु

यह काम करता है, लेकिन मेरे पास नेविगेशन बार में एक मेनू आइकन भी है और यह गायब हो गया है: / / मैं चाहता हूं कि सीमा मिटा दी जाए। सहायता: /
सौतेली समानीगो

इसने मेरे लिए काम किया लेकिन नए ViewController को धक्का देने के बाद यह वहां से लाइन को हटा देता है। मैं इसे कैसे रोक सकता हूं?
अनिरुद्ध महाले

36

स्विफ्ट 2 के साथ आप इसे इस तरह से कर सकते हैं:

AppDelegate फ़ाइल

फ़िनिश एप्लिकेशन के अंदर (..., didFinishLaunchingWithOptions launchOptions: ...)

UINavigationBar.appearance().shadowImage = UIImage()
UINavigationBar.appearance().setBackgroundImage(UIImage(), forBarMetrics: .Default)

स्विफ्ट 3 के लिए:

UINavigationBar.appearance().shadowImage = UIImage()
UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default)

सही उत्तर।
एड।

यह व्यापक उत्तर है!
madeny

Appdelegate में ऐसे उपयोगी डिफॉल्ट को लिखने के लिए बेहतर है कि उन्हें विषम स्थानों पर लिखें। सही उत्तर :)
Md रईस

35

इसे केवल UINavigationBar के विस्तार में लिखें

extension UINavigationBar {

    func shouldRemoveShadow(_ value: Bool) -> Void {
        if value {
            self.setValue(true, forKey: "hidesShadow")
        } else {
            self.setValue(false, forKey: "hidesShadow")
        }
    }
}

और आपके दृष्टिकोण में ...

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationController?.navigationBar.shouldRemoveShadow(true)        
}

और किसी भी दृष्टिकोण के लिए इस पूर्ववत को प्राप्त करने के लिए, बस गलत पास करें।


यह बहुत अच्छा काम करता है, लेकिन अगर यह नेव स्टैक पर सभी vcs के लिए छुपाता है। यदि आप इसे vc1 में उपयोग करते हैं और vc1 vc2 पर धकेल सकते हैं तो इसे vc2 पर भी छिपाया जाएगा। Vc2 में छाया दिखाने के लिए आपको इसे viewDidLoad में गलत पर सेट करना होगा। समस्या यह है कि जब आप vc1 पर वापस आते हैं तो यह फिर से दिखाई देगा क्योंकि इसे vc2 में रीसेट किया गया था। आपको आगे और पीछे जाने के लिए तर्क का उपयोग करना होगा जो इसके लायक नहीं हो सकता है। हालाँकि यदि आप नहीं चाहते हैं कि छाया चित्र किसी भी vcs पर दिखाई दे तो यह सबसे आसान तरीका है
लांस सामरिया

मान लें कि हमारे पास 5 viewControllers के साथ व्यूकंट्रोलर्स का ढेर है (और हमने पहले एक में छाया छिपाया है)। अब केवल 3rd व्यू कॉन्ट्रोलर के लिए, I we DON "T छाया को छुपाना चाहते हैं। इसलिए, मैं उस विधि को FALSE के साथ viewWillAppear में और TRUE के साथ viewWillDisappear के साथ 3rd viewController में कॉल करूंगा। यह सब लगता है!
गौरव चंदाराना

आपकी बिल्कुल सही, अच्छी सोच! यह मत सोचिए कि मैंने आपके जवाब को खटखटाया क्योंकि यह बहुत ही सक्सेसफुल और कुशल है, मैंने भी इसे वोट किया। मैं इसे हटाने के लिए इसका उपयोग करता हूं और त्रुटि संदेशों के लिए नावबार। मुझे जो समस्या मिली वह vc1 में इसे हटाते समय थी लेकिन इसे vc2 दिखा रहा था, लेकिन अगर vc2 में कोई त्रुटि थी, तो इसे देखने में हटा देना, जब यह काम नहीं करेगा। लेकिन फिर से यह एक बहुत ही अनोखी स्थिति है। मैं सामान्य मामले के उपयोग के लिए viewWillDisappear विचार पसंद करता हूं और आपको इसे अपने उत्तर में जोड़ना चाहिए। भले ही आपका कोड काम करता है और यह छाया को हटाने का एक आसान तरीका है! Sam
लांस सामरिया

एक जादू की तरह काम करता है। बस यह सुनिश्चित करना चाहता था कि यह निजी सेटिंग नहीं है?
inokey

2
यह एक उत्कृष्ट उत्तर है! मैंने एक उत्तर जोड़ा है जो कोड को सुव्यवस्थित करता है।
स्कॉट गार्डनर

13

टिंट सेट barStyleकरने .Blackसे पहले सेट करें:

self.navigationController?.navigationBar.translucent = false
self.navigationController?.navigationBar.barStyle = .Black
self.navigationController?.navigationBar.barTintColor = UIColor.blueColor()

यह थोड़े यादृच्छिक है कि यह वास्तव में काम करता है? या मैं पल रहा हूँ?
जो

@ अच्छी तरह से यह यहाँ काम कर रहा है :-) यह आपके लिए काम नहीं करता है?
gpbl

यह बात है, यह काम करता है। मैं सिर्फ अगर वहाँ क्यों barStyle काला करने के लिए यह फिर नीले :) करने के लिए पूरे barTintColor बदल जाता है मोड़ के रूप में एक व्याख्या है सोच रहा हूँ
जो

हो सकता है कि इसे काले और अपारदर्शी में सेट किया जाए, यह नेविगेशन में कुछ परतों / दृश्य को स्विच करता है ...
gpbl

मैं इस का उपयोग करने की कोशिश की, और यह नीचे की रेखा को हटा देता है लेकिन अगर सफेद रंग की पट्टी के उपयोग से शीर्षक दिखाई नहीं देता है: /
RileyDev

11

स्विफ्ट 5

हेयरलाइन छिपाने के लिए setBackgroundImage / shadowImage का उपयोग करते समय, थोड़ी देरी होती है। यह विधि विलंब को दूर करती है। गिरगिट फ्रेमवर्क को श्रेय । यह वह विधि है जिसका वे उपयोग करते हैं (ObjC में)


extension UINavigationController {
    func hideHairline() {
        if let hairline = findHairlineImageViewUnder(navigationBar) {
            hairline.isHidden = true
        }
    }
    func restoreHairline() {
        if let hairline = findHairlineImageViewUnder(navigationBar) {
            hairline.isHidden = false
        }
    }
    func findHairlineImageViewUnder(_ view: UIView) -> UIImageView? {
        if view is UIImageView && view.bounds.size.height <= 1.0 {
            return view as? UIImageView
        }
        for subview in view.subviews {
            if let imageView = self.findHairlineImageViewUnder(subview) {
                return imageView
            }
        }
        return nil
    }
}

1
एफडब्ल्यूआईडब्ल्यू, यह एकमात्र समाधान है जो आईओएस 13.4 पर मेरे लिए काम करता है ...
केविन्स्ट्यूबर

9

Luca Davanzo का जवाब बहुत अच्छा है, लेकिन यह iOS 10 में काम नहीं करता है। मैंने इसे iOS 10 और नीचे काम करने के लिए बदल दिया है।

for parent in navigationController!.view.subviews {
    for child in parent.subviews {
        for view in child.subviews { 
            if view is UIImageView && view.frame.height == 0.5 {
                view.alpha = 0
            }
        }
    }
}

आप UINavigationController का विस्तार भी कर सकते हैं और इसे बंद कर सकते हैं। removeFromSuperview()iOS 10 पर लाइन काम नहीं करेगी, इसलिए मैंने अभी अल्फा को 0 पर सेट किया है, इसलिए यह एक कॉल हर जगह संगत है।


अच्छी पकड़, किसी भी दृश्य को दिखाने के लिए / छुपाने के लिए किसी भी तरह से देखने के लिए जब भी नेविगेट करते हैं?
अश्क.न।

आपको बल्कि उन ऊंचाइयों की जांच करनी चाहिए जिनके पास ए है height >= 1.0। IPhone मॉडल पर एक 3x रेटिना स्क्रीन (उदाहरण के लिए 8 प्लस, XR ...) में हेयरलाइन की ऊंचाई 0.33 है।
fl034

7

स्विफ्ट 3+ में UINavigationBar से सीमा हटाने के लिए, उपयोग करें:

UINavigationBar.appearance().shadowImage = UIImage()
UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default)
UINavigationBar.appearance().isTranslucent = false

5

स्विफ्ट 3 के लिए

में viewDidLoadविधि

navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
navigationController?.navigationBar.shadowImage = UIImage()


4

स्विफ्ट 4 के लिए अपडेट होने की स्थिति में कोई सोच रहा है

navigationBar.shadowImage = UIImage()
navigationBar.backIndicatorImage = UIImage()

यह अब भी कम क्रिया है।


2

यह वह तरीका है यदि आप पृष्ठभूमि का रंग बदले बिना इसे करना चाहते हैं:

// Remove the border ImageView from the NavigationBar background
func hideBottomBorder() {
    for view in navigationBar.subviews.filter({ NSStringFromClass($0.dynamicType) == "_UINavigationBarBackground" }) as [UIView] {
        if let imageView = view.subviews.filter({ $0 is UIImageView }).first as? UIImageView {
            imageView.removeFromSuperview()
        }
    }
}

नोट: यह एक प्रोडक्शन ऐप पर क्रैश हो सकता है। जाहिर तौर पर नेवीगेशनबार को अपना दृश्य गायब होना पसंद नहीं है


2

स्वीकृत उत्तर ने मेरे लिए काम किया, लेकिन मैंने देखा कि जब मैं चाहता था कि छाया की छवि फिर से दिखाई दे, जब वापस पॉप करने या किसी अन्य vc के आगे बढ़ने के लिए नेविगेशन बार में ध्यान देने योग्य पलक दिखाई दे।

इस विधि का उपयोग करना navigationController?.navigationBar.setValue(true, forKey: "hidesShadow") दृश्य में । वर्तमान छाया दृश्य बार में छिपा है।

इन 2 विधियों का उपयोग करके

navigationController?.navigationBar.setBackgroundImage(nil, for: .default)
navigationController?.navigationBar.setValue(false, forKey: "hidesShadow")

देखने में विस्मयादिबोधक अभी भी होता है, लेकिन केवल जब छाया छवि फिर से दिखाई देती है और न ही नेविगेशन बार।

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    // 1. hide the shadow image in the current view controller you want it hidden in
    navigationController?.navigationBar.setValue(true, forKey: "hidesShadow")
    navigationController?.navigationBar.layoutIfNeeded()
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(true)

    // 2. show the shadow image when pushing or popping in the next view controller. Only the shadow image will blink
    navigationController?.navigationBar.setBackgroundImage(nil, for: .default)
    navigationController?.navigationBar.setValue(false, forKey: "hidesShadow")
    navigationController?.navigationBar.layoutIfNeeded()
}

1

स्विफ्ट 3 के लिए आपको थोड़ा अलग तरीके से लिखना चाहिए:

 self.navigationController?.navigationBar.setBackgroundImage(UIImage(),
    for: UIBarMetrics.default)
   self.navigationController?.navigationBar.shadowImage = UIImage()


1

अनुप्रयोग प्रतिनिधि

UINavigationBar.appearance().setBackgroundImage(UIImage(), for: UIBarMetrics.default)
UINavigationBar.appearance().shadowImage = UIImage()

1

यदि आप केवल निचली रेखा को हटाना चाहते हैं और नेविगेशनबार के ठोस रंग को रखना चाहते हैं, तो कोड की इन पंक्तियों को व्यूडेलड में जोड़ें: स्विफ्ट 3, 4:

navigationController?.navigationBar.shadowImage = UIImage()
navigationController?.navigationBar.isTranslucent = false

शांति!


0

बॉर्डर लाइन एक UIImageView है और एक सबव्यू को हटाने के लिए जो एक imageView है, UIImageView के साथ barButtonItems को हटा देगा। नीचे कोड आपको इसे हटाने में मदद करेगा। आशा है कि यह मेरी तरह एक मुद्दे का सामना करने वाले किसी व्यक्ति की मदद करता है।

for parent in self.navigationController!.navigationBar.subviews {
        for childView in parent.subviews {
            if childView.frame.height == 0.5 {
                childView.removeFromSuperview()
            }
        }
    }

UIImageView बॉर्डर केवल 0.5 की ऊंचाई पर है इसलिए यह कोड केवल उसी को हटाता है।


इससे मेरे लिए क्रैश हो गया। मुझे लगता है कि माता-पिता और चाइल्ड व्यूज को हर एक की जांच करने से पहले शून्य होने की स्थिति में बाहर निकालने की आवश्यकता होती है। मैं हालांकि एक कस्टम UINavigationController का उपयोग कर रहा हूं, इसलिए मानक बार वाले अन्य उपयोगकर्ताओं के लिए ऐसा नहीं हो सकता है।
नतालिया

0

AppDelegate के भीतर , इसने विश्व स्तर पर NavBar के प्रारूप को बदल दिया है और नीचे की रेखा / सीमा को हटा दिया है:

 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    UINavigationBar.appearance().setBackgroundImage(UIImage(), forBarPosition: UIBarPosition.Any, barMetrics: UIBarMetrics.Default)
    UINavigationBar.appearance().shadowImage = UIImage()
    UINavigationBar.appearance().tintColor = UIColor.whiteColor()
    UINavigationBar.appearance().barTintColor = UIColor.redColor()
    UINavigationBar.appearance().translucent = false
    UINavigationBar.appearance().clipsToBounds = false
    //UINavigationBar.appearance().backgroundColor = UIColor.redColor()
    UINavigationBar.appearance().titleTextAttributes = [NSFontAttributeName : (UIFont(name: "FONT NAME", size: 18))!, NSForegroundColorAttributeName: UIColor.whiteColor()] }

विशिष्ट वीसी पर कुछ भी अलग से लागू करने में कामयाब नहीं हैं, लेकिन इससे 90% लोगों को मदद मिलेगी


UINavigationBar.appearance ()। बैकग्राउंड कलर = UIColor.redColor () की आवश्यकता नहीं है।
सबीलैंड

0

यह नैट कुक के उत्तर के स्विफ्ट 3 बेस में उत्तर है

   self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
    self.navigationController?.navigationBar.shadowImage = UIImage()

0

iOS 11 और स्विफ्ट 4 आपको निम्नलिखित कोशिश करनी चाहिए कि क्या आप बॉर्डर को हटाना चाहते हैं, लेकिन नेवीगोनबार ट्रांसलूसेंट नहीं बनाते हैं
self.navigationBar.shadowImage = UIImage()


0

अपने कस्टम नेविगेशनकंट्रोलर में इन पंक्तियों को जोड़ें:

self.navigationBar.setBackgroundImage(UIImage(), for:.default)
self.navigationBar.shadowImage = UIImage()
self.navigationBar.layoutIfNeeded()

महत्वपूर्ण लेख

यदि आप पहली पंक्ति viewDidLoad () विधि का उपयोग करते हैं तो अंतिम पंक्ति महत्वपूर्ण है क्योंकि नेविगेशनकंट्रोलर को नेव बार को रिड्राऊंट करना चाहिए लेकिन आसानी से आप इस का उपयोग कर सकते हैं बिना waveIfNeeded () व्यूविलेपियर () विधि में बार बार ड्रॉ करने से पहले।


0

जैक चेन की स्विफ्टियर विधि:

extension UINavigationController {

    var isHiddenHairline: Bool {
        get {
            guard let hairline = findHairlineImageViewUnder(navigationBar) else { return true }
            return hairline.isHidden
        }
        set {
            if let hairline = findHairlineImageViewUnder(navigationBar) {
                hairline.isHidden = newValue
            }
        }
    }

    private func findHairlineImageViewUnder(_ view: UIView) -> UIImageView? {
        if view is UIImageView && view.bounds.size.height <= 1.0 {
            return view as? UIImageView
        }

        for subview in view.subviews {
            if let imageView = self.findHairlineImageViewUnder(subview) {
                return imageView
            }
        }

        return nil
    }
}

का उपयोग करते हुए:

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        navigationController?.isHiddenHairline = true
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        navigationController?.isHiddenHairline = false
    }

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