UINavigationBar 1px निचला रेखा कैसे छिपाएं


443

मेरे पास एक ऐप है जो कभी-कभी सामग्री के साथ मिश्रण करने के लिए अपने नेविगेशन बार की आवश्यकता होती है।

क्या किसी को पता है कि कैसे छुटकारा पाने या इस कष्टप्रद छोटी पट्टी का रंग बदलने के लिए?

स्थिति के नीचे की छवि पर - मैं "रूट व्यू कंट्रोलर" के नीचे इस 1px ऊंचाई लाइन के बारे में बात कर रहा हूं

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


इसकी समीक्षा करें: stackoverflow.com/questions/19101361/…
कुलदीप

नेविगेशन ऊंचाई 1px कैसे बढ़ाएं?
सुरेश दुरिशेट्टी

जवाबों:


738

IOS 13 के लिए:

.shadowColorसंपत्ति का उपयोग करें

यदि यह गुण शून्य है या इसमें स्पष्ट रंग है, तो बार कोई छाया नहीं दिखाता है

उदाहरण के लिए:

let navigationBar = navigationController?.navigationBar
let navigationBarAppearence = UINavigationBarAppearance()
navigationBarAppearence.shadowColor = .clear
navigationBar?.scrollEdgeAppearance = navigationBarAppearence

IOS 12 और उससे नीचे के लिए:

ऐसा करने के लिए, आपको एक कस्टम छाया चित्र सेट करना चाहिए। लेकिन छाया छवि दिखाए जाने के लिए आपको एक कस्टम पृष्ठभूमि छवि सेट करने की आवश्यकता है, Apple के प्रलेखन से बोली:

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

इसलिए:

let navigationBar = navigationController!.navigationBar
navigationBar.setBackgroundImage(#imageLiteral(resourceName: "BarBackground"),
                                                        for: .default)
navigationBar.shadowImage = UIImage()

ऊपर इसे छिपाने का एकमात्र "आधिकारिक" तरीका है। दुर्भाग्य से, यह बार की पारभासी को हटा देता है।

मुझे पृष्ठभूमि की छवि नहीं चाहिए, बस रंग चाहिए

आपके पास वे विकल्प हैं:

  1. ठोस रंग, कोई पारभासी:

    navigationBar.barTintColor = UIColor.redColor()
    navigationBar.isTranslucent = false
    navigationBar.setBackgroundImage(UIImage(), for: .default)
    navigationBar.shadowImage = UIImage()
    
  2. रंग से भरी छोटी पृष्ठभूमि की छवि बनाएं और उसका उपयोग करें।

  3. नीचे वर्णित 'हैकी' विधि का उपयोग करें। यह बार पारभासी भी रखेगा।

बार पारभासी कैसे रखें?

पारभासी रखने के लिए आपको एक और दृष्टिकोण की आवश्यकता होती है, यह एक हैक की तरह दिखता है लेकिन अच्छी तरह से काम करता है। जिस छाया को हम हटाने की कोशिश कर रहे हैं वह UIImageViewकहीं नीचे एक हेयरलाइन है UINavigationBar। हम इसे पा सकते हैं और जरूरत पड़ने पर इसे छिपा सकते हैं / दिखा सकते हैं।

नीचे दिए गए निर्देश मान लें कि आपको अपनी UINavigationControllerपदानुक्रम के केवल एक नियंत्रक में छिपी हेयरलाइन की आवश्यकता है।

  1. उदाहरण चर घोषित करें:

    private var shadowImageView: UIImageView?
  2. वह विधि जोड़ें जो इस छाया को ढूंढती है (हेयरलाइन) UIImageView:

    private func findShadowImage(under view: UIView) -> UIImageView? {
        if view is UIImageView && view.bounds.size.height <= 1 {
            return (view as! UIImageView)
        }
    
        for subview in view.subviews {
            if let imageView = findShadowImage(under: subview) {
                return imageView
            }
        }
        return nil
    }
    
  3. जोड़ें / संपादित करें viewWillAppear/viewWillDisappearतरीके:

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
    
        if shadowImageView == nil {
            shadowImageView = findShadowImage(under: navigationController!.navigationBar)
        }
        shadowImageView?.isHidden = true
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
    
        shadowImageView?.isHidden = false
    }

एक ही विधि को UISearchBarहेयरलाइन के लिए भी काम करना चाहिए , और (लगभग) कुछ और जिसे आपको छिपाने की आवश्यकता है :)

मूल विचार के लिए @Leo Natan को बहुत धन्यवाद!


103
आप UINavigationBarसंपत्ति का दृश्य भी निर्धारित कर सकते हैं:clipsToBounds = YES
चतुर

3
@richarddas clipsToBounds = YESएक आकर्षण की तरह काम करता है! धन्यवाद!
रोमियोल्ड

3
ClipToBounds हमेशा कुछ लेआउट के लिए काम नहीं करता है। इस जवाब ने मेरे लिए एकदम सही काम किया। केवल मैंने UINavigationBar उपवर्ग बनाया और उपर्युक्त कोड का उपयोग छाया चित्र को छिपाने के लिए -layoutSubview विधियों में किया। धन्यवाद!
cgossain

7
बस ध्यान देने के लिए मुझे समस्या थी जहां मेरा iOS शीर्ष स्थिति बार पारभासी हो गया और मैं अपने टेबल व्यू को UINavigationBar के पीछे स्क्रॉल कर सकता था। मैंने इसे सेट किया है setTranslucent = NO।
व्लाद

2
IOS 10 में ऐसा लगता है कि जब viewWillAppear कहा जाता है तो हम प्राप्त नहीं कर सकते हैंshadowImageView
xi.lin

241

नीचे बस मदद कर सकते हैं!

स्विफ्ट:

self.navigationController?.navigationBar.setValue(true, forKey: "hidesShadow")

उद्देश्य सी:

[self.navigationController.navigationBar setValue:@(YES) forKeyPath:@"hidesShadow"];

6
मैं Xcode 8 और डेवलपर के लिए> iOS 8 पर हूं और इसके अलावा किसी ने भी मेरे लिए काम नहीं किया।
वाकस

2
इसके अलावा XCode 8 और> iOS 8. यह एकमात्र उत्तर है जो मेरे लिए काम करता है।
5

1
यह एकमात्र छोटा और सरल उत्तर है जिसने मेरे लिए iOS 10 और Xcode 8.3.1 के लिए काम किया। धन्यवाद दोस्त।
विशाल सोनवणे

1
उद्देश्य-सी: self.navigationController.navigationBar.shadowImage = [UIImage new];
मार्सेलो डॉस सैंटोस

1
केवल यह मेरे लिए iOS 13.3.1 संस्करण iPad में काम कर रहा है।
रवि

145

यदि आप एक ठोस नेविगेशन बार रंग का उपयोग करना चाहते हैं और इसे अपने स्टोरीबोर्ड में सेट किया है, तो अपनी AppDelegateकक्षा में इस कोड का उपयोग उपस्थिति प्रॉक्सी के माध्यम से 1 पिक्सेल सीमा को हटाने के लिए करें:

[[UINavigationBar appearance] setBackgroundImage:[[UIImage alloc] init]
                                  forBarPosition:UIBarPositionAny
                                      barMetrics:UIBarMetricsDefault];

[[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]];

2
यह आपके कोड बेस में हर एक बार के लिए इसे वैश्विक रूप से सेट करता है ... अधिकांश समय ऐसा नहीं है जो आप चाहते हैं।
क्रिस्टोफ

97

इसे इस्तेमाल करे:

[[UINavigationBar appearance] setBackgroundImage: [UIImage new]  
                                   forBarMetrics: UIBarMetricsDefault];

[UINavigationBar appearance].shadowImage = [UIImage new];

नीचे दी गई छवि में स्पष्टीकरण (iOS7 नेविगेशनबार) है:

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

और इस SO प्रश्न की जाँच करें: iOS7 - UINavigationBar बॉर्डर रंग बदलें


जैसा कि सेरही ने कहा, छाया की छवि को स्वीकार करने के लिए एक कस्टम बैकग्राउंड इमेज सेट करनी होगी।
अकाशिवकी

3
अपने AppDelegate में ऐसा करें।
myusuf3

शानदार जवाब ... मेरा दिन _ / \ _
अक्षय

@RPM iOS 7,8,9,10 में शानदार काम करता है। स्विफ्ट के लिए मध्यम में viewControlles के नेविगेशन बार के लिए समान कोड है ।
अख्रमेव

64

सेरही के उत्तर के स्विफ्ट संस्करण को जोड़ना चाहते थे। मैंने UIBarExtension.swiftनिम्नलिखित के साथ बनाया :

import Foundation
import UIKit

extension UINavigationBar {
    func hideBottomHairline() {
        self.hairlineImageView?.isHidden = true
    }

    func showBottomHairline() {
        self.hairlineImageView?.isHidden = false
    }
}

extension UIToolbar {
    func hideBottomHairline() {
        self.hairlineImageView?.isHidden = true
    }

    func showBottomHairline() {
        self.hairlineImageView?.isHidden = false
    }
}

extension UIView {
    fileprivate var hairlineImageView: UIImageView? {
        return hairlineImageView(in: self)
    }

    fileprivate func hairlineImageView(in view: UIView) -> UIImageView? {
        if let imageView = view as? UIImageView, imageView.bounds.height <= 1.0 {
            return imageView
        }

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

        return nil
    }
}

धन्यवाद! यह एक उत्तर होना चाहिए।
पेइवेइचेन

यह नेवीगेशन के साथ काम करता है लेकिन यूटूलबार के साथ काम नहीं करता है
टॉमस्वर

मैं iOS 12 के साथ मिल रहा हूं यह कोई और काम नहीं कर रहा है। :(।
क्रिस प्रिंस

महान iOS 13
ttorbik

यह एक उत्तर होना चाहिए। ios 13 में आकर्षण की तरह काम करता है
COVID19

63

इसे करने का तेज़ तरीका:

UINavigationBar.appearance().setBackgroundImage(
    UIImage(),
    forBarPosition: .Any,
    barMetrics: .Default)

UINavigationBar.appearance().shadowImage = UIImage()

2
यह चिकना उत्तर खोजने से पहले इस सूची को बहुत नीचे लाने के लिए बहुत दुर्लभ है। +1!
सूडो

3
यह UINavigationBar tho की पूरी पृष्ठभूमि को छुपाता है: /
user365314

गलत, यह पूरी पृष्ठभूमि को भी छुपाता है!
टॉमस्वायर

3
नोट: आपको नेविगेशनबेर के समतुल्य को गलत पर सेट करना है
dmathewwws

19

स्विफ्ट में सरल समाधान

   let navigationBar = self.navigationController?.navigationBar
    navigationBar?.setBackgroundImage(UIImage(), forBarPosition: UIBarPosition.Any, barMetrics: UIBarMetrics.Default)
    navigationBar?.shadowImage = UIImage()

3
सभी उत्तरों में से +1, यही मेरे लिए अंत में काम आया। इसने अन्य उत्तरों के रूप में स्टेटस बार को गड़बड़ नहीं किया, और यह प्रोजेक्ट में सभी नेविगेशन बारों को नहीं, केवल एक नेविगेशन कंट्रोलर बार को बदलने की समस्या को संबोधित करता है।
जोगलिंड

? स्विफ्ट 4.2 संस्करण: navigationBar .setBackgroundImage (UIImage (), के लिए: UIBarPosition.any, barMetrics: UIBarMetrics.default) navigationBar .shadowImage = UIImage ()?
airowe

16

सेरहिल के उत्तर का अध्ययन करने के बाद, मैंने एक पॉड UINavigationBar + एडिशन बनाया जो आसानी से हेयरलाइन को छिपा सकता है।

#import "UINavigationBar+Addition.h"

- (void)viewDidLoad {
    [super viewDidLoad];

    UINavigationBar *navigationBar = self.navigationController.navigationBar;
    [navigationBar hideBottomHairline];
}

16

स्विफ्ट 3.0 में

AppDelegate.swiftअपने एप्लिकेशन फ़ंक्शन में निम्न कोड जोड़कर अपना संपादन करें :

// Override point for customization after application launch.

// Remove border in navigationBar
UINavigationBar.appearance().shadowImage = UIImage()
UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default)

16

IOS 13 के रूप में छाया सेट करने या निकालने के लिए एक सिस्टम एपीआई है

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

    let appearance = UINavigationBarAppearance()
    appearance.shadowImage = nil
    appearance.shadowColor = nil
    navigationController.navigationBar.standardAppearance = appearance

https://developer.apple.com/documentation/uikit/uibarappearance/3198009-shadowimage


शैडोइमेज और शैडोक्लोर UINavigationBarAppearanceहेडर में प्रलेखित नहीं हैं !! मुझे यह कभी नहीं मिलेगा। धन्यवाद, इसने मेरे मुद्दों को 100% हल कर दिया
रोजर ओबा

1
हाँ, यह मेरे लिए भी ठीक काम कर रहा है IOS 13 में बहुत बहुत धन्यवाद @glotcha।
योगेश पटेल

@glotcha राइट ....
दिग्विजय

धन्यवाद। केवल एक चीज जो मेरे लिए काम करती है
एलियनथेगो

13

स्टोरीबोर्ड से भी छिपाया जा सकता है (Xcode 10.1 पर काम करना)

रनटाइम विशेषता जोड़कर: hidesShadow - बूलियन - सच

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


11

pxpgraphics 'समाधान स्विफ्ट 2.0 के लिए अद्यतन किया गया

extension UINavigationBar {

    func hideBottomHairline()
    {
        hairlineImageViewInNavigationBar(self)?.hidden = true
    }

    func showBottomHairline()
    {
        hairlineImageViewInNavigationBar(self)?.hidden = false
    }

    private func hairlineImageViewInNavigationBar(view: UIView) -> UIImageView?
    {
        if let imageView = view as? UIImageView where imageView.bounds.height <= 1
        {
            return imageView
        }

        for subview: UIView in view.subviews
        {
            if let imageView = hairlineImageViewInNavigationBar(subview)
            {
                return imageView
            }
        }

        return nil
    }

}

extension UIToolbar
{

    func hideHairline()
    {
        let navigationBarImageView = hairlineImageViewInToolbar(self)?.hidden = true
    }

    func showHairline()
    {
        let navigationBarImageView = hairlineImageViewInToolbar(self)?.hidden = false
    }

    private func hairlineImageViewInToolbar(view: UIView) -> UIImageView?
    {
        if let imageView = view as? UIImageView where imageView.bounds.height <= 1
        {
            return imageView
        }

        for subview: UIView in view.subviews
        {
            if let imageView = hairlineImageViewInToolbar(subview)
            {
                return imageView
            }
        }

        return nil
    }

}

हाय, iOS के लिए नया और खुद को सिखाने की कोशिश। मैं एक्सटेंशन का उपयोग कैसे करूं? मेरे पास एक दृश्य नियंत्रक फ़ाइल है और मैंने इन एक्सटेंशनों को कक्षा के दायरे से बाहर रखा है। लेकिन फिर मैं छिपाना / showHairline () कैसे कहूं? वास्तव में समझ में नहीं आता कि एक्सटेंशन का उपयोग कैसे किया जाता है, लेकिन इसका उपयोग इतने सारे समाधानों के लिए किया जाता है, लेकिन मुझे समझ में नहीं आता है कि वे वास्तविक कोड में कैसे लागू होते हैं
टॉमी के

एक्सटेंशन आपके मौजूदा वर्गों में कार्यक्षमता जोड़ता है। किसी भी विस्तारित वर्ग, संरचना, एनुम, आदि में ये नई सुविधाएँ आपके लिए उपलब्ध होंगी जब भी आपको उनका उपयोग करने की आवश्यकता होगी। यहाँ और देखें: developer.apple.com/library/ios/documentation/Swift/Conceptual/…
tf.alves

हम तो मैं बस का उपयोग करने में सक्षम होना चाहिए UINavigationController().navigationBar/toolbar.hide/showBottomHairline()तो नहीं? मैं यह कोशिश कर रहा हूँ, लेकिन कोई फायदा नहीं हुआ। क्या मैं सही से नहीं समझ रहा हूँ?
टॉमी के


10

मैं एक UINavigationBar एक्सटेंशन का उपयोग करता हूं जो मुझे UIAppearance API का उपयोग करके उस छाया को छिपाने / दिखाने में सक्षम करता है या चयन करता है कि किस नेविगेशन बार को Storyboard (या स्रोत कोड) का उपयोग करके उस छाया को छिपाना / दिखाना है। यहाँ विस्तार है:

import UIKit

private var flatAssociatedObjectKey: UInt8 = 0

/*
  An extension that adds a "flat" field to UINavigationBar. This flag, when
  enabled, removes the shadow under the navigation bar.
 */
@IBDesignable extension UINavigationBar {
    @IBInspectable var flat: Bool {
        get {
            guard let obj = objc_getAssociatedObject(self, &flatAssociatedObjectKey) as? NSNumber else {
                return false
            }
            return obj.boolValue;
        }

        set {
            if (newValue) {
                let void = UIImage()
                setBackgroundImage(void, forBarPosition: .Any, barMetrics: .Default)
                shadowImage = void
            } else {
                setBackgroundImage(nil, forBarPosition: .Any, barMetrics: .Default)
                shadowImage = nil
            }
            objc_setAssociatedObject(self, &flatAssociatedObjectKey, NSNumber(bool: newValue),
                    objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        }
    }
}

अब, उन सभी नेविगेशन पट्टियों पर छाया को निष्क्रिय करने के लिए जिन्हें आपको उपयोग करना है:

UINavigationBar.appearance().flat = true

या आप स्टोरीबोर्ड का उपयोग करके इस व्यवहार को सक्षम / अक्षम कर सकते हैं:

नेविगेशन बार स्टोरीबोर्ड


@ NunoGonçalves, आप flatAssociatedObjectKeyअपने संबंधित ऑब्जेक्ट की पहचान करने के लिए एक अद्वितीय इंट (पॉइंटर के रूप में व्यवहार) के रूप में सोच सकते हैं । यहाँ एक निजी संस्करण के मेमोरी एड्रेस द्वारा परिभाषित किया गया है। मैंने इस संस्करण को जोड़ने के लिए प्रतिक्रिया को अद्यतन किया। अधिक जानकारी के लिए nshipster.com/associated-objects देखें ।
अलविवि

अच्छा समाधान लेकिन तभी काम करता है जब नेविगेशन बार translucentझूठे पर सेट हो
ZYiOS

9

स्विफ्ट 4 टेस्टेड वन लाइन सॉल्यूशन

में Viewdidload() सेट नेविगेशन नियंत्रक के userdefault कुंजी "hidesShadow" के लिए सही मूल्य

override func viewDidLoad() {
    super.viewDidLoad()

    self.navigationController?.navigationBar.setValue(true, forKey: "hidesShadow")

}

1
पूरी तरह से काम कर रहा है !!
प्रशांत तुकडिय़ा

7

स्विफ्ट ने यह डाल दिया

UINavigationBar.appearance().setBackgroundImage(UIImage(), forBarPosition: .Any, barMetrics: .Default)
UINavigationBar.appearance().shadowImage = UIImage()

में

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

और यह बैकग्राउंड कलर को भी हटा देता है।
टॉमस्वर

7

एक अन्य विकल्प यदि आप पारभासी को संरक्षित करना चाहते हैं और आप UINavigationControllerअपने ऐप में हर चीज को उप-वर्ग में नहीं रखना चाहते हैं :

#import <objc/runtime.h>

@implementation UINavigationController (NoShadow)

+ (void)load {
    Method original = class_getInstanceMethod(self, @selector(viewWillAppear:));
    Method swizzled = class_getInstanceMethod(self, @selector(swizzled_viewWillAppear:));
    method_exchangeImplementations(original, swizzled);
}

+ (UIImageView *)findHairlineImageViewUnder:(UIView *)view {
    if ([view isKindOfClass:UIImageView.class] && view.bounds.size.height <= 1.0) {
        return (UIImageView *)view;
    }

    for (UIView *subview in view.subviews) {
        UIImageView *imageView = [self findHairlineImageViewUnder:subview];
        if (imageView) {
            return imageView;
        }
    }

    return nil;
}

- (void)swizzled_viewWillAppear:(BOOL)animated {
    UIImageView *shadow = [UINavigationController findHairlineImageViewUnder:self.navigationBar];
    shadow.hidden = YES;

    [self swizzled_viewWillAppear:animated];
}

@end

6
Slightly Swift Solution 
func setGlobalAppearanceCharacteristics () {
    let navigationBarAppearace = UINavigationBar.appearance()
    navigationBarAppearace.tintColor = UIColor.white
    navigationBarAppearace.barTintColor = UIColor.blue
    navigationBarAppearace.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
    navigationBarAppearace.shadowImage = UIImage()

}

धन्यवाद जेम्स! मुझे समझ नहीं आ रहा है कि किसी ने आपके जवाब को वोट क्यों दिया।
दिनू मिहाई फ्लोरियन

अगर आपको इसकी आवश्यकता है, तो आप इसे भी जोड़ सकते हैं: self.navigationController.navigationBar.translucent = false self.navigationController.navigationBar.clipsToBounds = false self.navigationController.navigationBar.shadowImage = UIImage (सेल्फी)। ()
एलेसांद्रो ओरानो

5

स्विफ्ट 4.2 में समाधान :

private func removeHairlineFromNavbar() {
    UINavigationBar.appearance().setBackgroundImage(
        UIImage(),
        for: .any,
        barMetrics: .default)
    UINavigationBar.appearance().shadowImage = UIImage()
}

इस फ़ंक्शन को पहले Viewcontroller पर रखें और इसे कॉल करें viewdidload


4

IOS8 में, यदि आप सेट UINavigationBar.barStyleकरने के लिए .Blackआप सीमा के बिना सादे रंग के रूप में बार की पृष्ठभूमि सेट कर सकते हैं।

स्विफ्ट में:

UINavigationBar.appearance().translucent = false
UINavigationBar.appearance().barStyle = UIBarStyle.Black
UINavigationBar.appearance().barTintColor = UIColor.redColor()

यह इसे पूरा करने का सबसे साफ उपाय और सबसे अच्छा तरीका है। यदि आपको <iOS 8 का समर्थन नहीं करना है, तो इस उत्तर का उपयोग न करने का कोई कारण नहीं है। धन्यवाद।
user3344977

बहुत अच्छा काम करता है। मैंने इसे स्टोरीबोर्ड में भी सेट किया, इसलिए किसी कोड की भी आवश्यकता नहीं थी।
विक्ज़िला

1
ऐसा करने से आपको मानक छाया के बजाय बहुत छोटी सफेद रेखा मिलती है।
वेगार्ड

4

दो लाइनों का समाधान जो मेरे लिए काम करता है। ViewDidLoad विधि में इसे जोड़ने का प्रयास करें:

navigationController?.navigationBar.setValue(true, forKey: "hidesShadow")
self.extendedLayoutIncludesOpaqueBars = true

केवल इसने मेरे लिए काम किया
उस्मा बिन अत्तिक

3

यहाँ एक बहुत ही सरल उपाय है:

self.navigationController.navigationBar.clipsToBounds = YES;

37
स्टेटस बार एरिया को भी क्लिप किया गया है।
रोष

3

सरल समाधान - स्विफ्ट 5

  1. एक एक्सटेंशन बनाएं:

    extension UIImage {
    
        class func hideNavBarLine(color: UIColor) -> UIImage? {
    
            let rect = CGRect(x: 0, y: 0, width: 1, height: 1)
            UIGraphicsBeginImageContext(rect.size)
            let context = UIGraphicsGetCurrentContext()
            context?.setFillColor(color.cgColor)
            context?.fill(rect)
    
    
            let navBarLine = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()
            return navBarLine
        }
    }
  2. इसे इसमें जोड़ें viewDidLoad():

    self.navigationController?.navigationBar.shadowImage = UIImage.hideNavBarLine(color: UIColor.clear)


2

पृष्ठभूमि छवि सेट करने में समस्या यह धुंधलापन को दूर करती है। आप इसे बिना बैकग्राउंड इमेज सेट किए हटा सकते हैं। मेरा जवाब यहां देखें ।


2

आपको UISearchBar के नीचे एक दृश्य जोड़ना चाहिए

let rect = searchController.searchBar.frame;
let lineView : UIView = UIView.init(frame: CGRect.init(x: 0, y: rect.size.height-1, width: rect.size.width, height: 1))
lineView.backgroundColor = UIColor.init(hexString: "8CC73E")
searchController.searchBar.addSubview(lineView)

मुझे विश्वास नहीं हो रहा है कि यह अभी भी एक मुद्दा है - बस फिर से आ गया! लेकिन यह समाधान इस समय सबसे अच्छा संभव है; धन्यवाद @ शोटेट
रिचपेज़ २

1

मुझे पता है कि यह एक पुराना धागा है, लेकिन मुझे एक समाधान मिला जो वास्तव में अच्छी तरह से काम करता है:

उपवर्ग UINavigationBar। अपने UINavigationBar उपवर्ग में, ओवरराइड किए गए कोड के साथ निम्नलिखित कोड देखें:

- (void)didAddSubview:(UIView *)subview
{
    [super didAddSubview:subview];

    if ([subview isKindOfClass:[UIImageView class]]) {
        [subview setClipsToBounds:YES];
    }
}

1

मैंने इसके लिए एक एक्सटेंशन बनाया ... फ़ॉर्मेटिंग के बारे में क्षमा करें (यह मेरा पहला उत्तर है)।

उपयोग:

  override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationController?.hideShadow = true
}

एक्सटेंशन:

 UINavigationController.swift
//  Created by Ricardo López Rey on 16/7/15.

import Foundation


struct UINavigationControllerExtension {
    static var hideShadowKey : String = "HideShadow"
static let backColor = UIColor(red: 247/255, green: 247/255, blue: 248/255, alpha: 1.0)
}

extension UINavigationController {

    var hideShadow : Bool {
        get {
            if let ret =  objc_getAssociatedObject(self, &UINavigationControllerExtension.hideShadowKey) as? Bool {
                return ret
            } else {
                return false
            }


        }
        set {
            objc_setAssociatedObject(self,&UINavigationControllerExtension.hideShadowKey,newValue, objc_AssociationPolicy(OBJC_ASSOCIATION_RETAIN_NONATOMIC))

            if newValue {


            self.navigationBar.setBackgroundImage(solidImage(UINavigationControllerExtension.backColor), forBarMetrics: UIBarMetrics.Default)

                self.navigationBar.shadowImage = solidImage(UIColor.clearColor())
            } else {
                self.navigationBar.setBackgroundImage(nil, forBarMetrics: UIBarMetrics.Default)
            }
        }
    }

    private func solidImage(color: UIColor, size: CGSize = CGSize(width: 1,height: 1)) -> UIImage {
        var rect = CGRectMake(0, 0, size.width, size.height)
        UIGraphicsBeginImageContextWithOptions(size, false, 0)
        color.setFill()
        UIRectFill(rect)
        var image: UIImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image
    }


}

1

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% लोगों को मदद मिलेगी


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

    UIImage *emptyImage = [UIImage new];
    self.navigationController.navigationBar.shadowImage = emptyImage;
    [self.navigationController.navigationBar setBackgroundImage:emptyImage forBarMetrics:UIBarMetricsDefault];
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.