วิธีการซ่อนบรรทัดด้านล่าง UINavigationBar 1px


443

ฉันมีแอพที่บางครั้งต้องการแถบการนำทางเพื่อให้เข้ากับเนื้อหา

ไม่มีใครรู้วิธีกำจัดหรือเปลี่ยนสีของแถบเล็ก ๆ ที่น่ารำคาญนี้หรือไม่?

ในภาพด้านล่างสถานการณ์ฉันมี - ฉันกำลังพูดถึงบรรทัดความสูง 1px ด้านล่าง "ผู้ควบคุมมุมมองรูท"

ป้อนคำอธิบายรูปภาพที่นี่


ตรวจสอบนี้: stackoverflow.com/questions/19101361/ …
Kuldeep

วิธีเพิ่มความสูงการนำทาง 1px
Suresh Durishetti

คำตอบ:


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
cleverbit

3
@richarddas clipsToBounds = YESทำงานเหมือนจับใจ! ขอบคุณ!
romeouald

3
ClipsToBounds ไม่สามารถใช้งานได้กับบางเลย์เอาต์ คำตอบนี้เหมาะสำหรับฉัน มีเพียงฉันเท่านั้นที่สร้างคลาสย่อย UINavigationBar และใช้รหัสด้านบนเพื่อซ่อนภาพเงาในเมธอด -layoutSubview ขอบคุณ!
cgossain

7
เพิ่งทราบว่าฉันมีปัญหาที่แถบสถานะด้านบน iOS ของฉันกลายเป็นโปร่งแสงและฉันเห็นการเลื่อนดูตารางของฉันด้านหลัง UINavigationBar ฉันแก้ไขสิ่งนี้ด้วยการตั้งค่า setTranslucent = NO
ลาด

2
ใน iOS 10 ดูเหมือนว่าเมื่อviewWillAppear ถูกเรียกว่าเราไม่สามารถรับได้shadowImageView
xi.lin

241

ด้านล่างนี้สามารถช่วยได้ง่ายๆ!

สวิฟท์:

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

วัตถุประสงค์ C:

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

6
ฉันใช้ Xcode 8 และผู้พัฒนาสำหรับ> iOS 8 และฉันไม่สามารถทำงานได้ทั้งหมดยกเว้นตอนนี้
Vakas

2
บน XCode 8 และ> iOS 8 นี่เป็นคำตอบเดียวที่เหมาะกับฉัน
cloudcal

1
นี่เป็นคำตอบสั้น ๆ ที่ง่ายสำหรับฉันสำหรับ iOS 10 และ Xcode 8.3.1 ขอบคุณชาย
Vishal Sonawane

1
วัตถุประสงค์ -C: self.navigationController.navigationBar.shadowImage = [UIImage ใหม่];
Marcelo dos Santos

1
สิ่งนี้ใช้ได้กับฉันใน iOS 13.3.1 เวอร์ชัน iPad เท่านั้น
Ravi

145

หากคุณต้องการใช้สีแถบนำทางที่มั่นคงและตั้งค่านี้ในกระดานเรื่องราวของคุณให้ใช้รหัสนี้ในAppDelegateชั้นเรียนของคุณเพื่อลบขอบ 1 พิกเซลผ่านพร็อกซีลักษณะที่ปรากฏ:

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

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

2
มันตั้งค่าเป็นส่วนกลางสำหรับแถบนำทางทุกครั้งในฐานรหัสของคุณ ... ส่วนใหญ่ไม่ใช่สิ่งที่คุณต้องการ
Christoph

97

ลองสิ่งนี้:

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

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

ภาพด้านล่างมีคำอธิบาย (iOS7 NavigationBar):

ป้อนคำอธิบายรูปภาพที่นี่

และตรวจสอบคำถาม SO นี้: iOS7 - เปลี่ยนสีเส้นขอบ UINavigationBar


ดังที่ Serhii กล่าวว่าต้องกำหนดภาพพื้นหลังที่กำหนดเองเพื่อให้สามารถยอมรับภาพเงาได้
akashivskyy

3
ทำสิ่งนี้ใน AppDelegate ของคุณ
myusuf3

คำตอบที่ดี ... บันทึกวันของฉัน _ / \ _
Akshay

@RPM ใช้งานได้ดีใน iOS 7,8,9,10 มีรหัสเดียวกันสำหรับแถบนำทางของ viewControlles เป็นสื่อกลางสำหรับ Swift
Akhrameev

64

ต้องการเพิ่มคำตอบของ Serhii ในเวอร์ชัน Swift ฉันสร้าง a 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
    }
}

ขอบคุณ! อันนี้ควรเป็นคำตอบ
PeiweiChen

มันใช้งานได้กับ navigationBar แต่ไม่สามารถใช้งานกับ uitoolbar ได้
TomSawyer

ฉันค้นหาด้วย iOS 12 นี่ไม่ทำงานอีกต่อไป :(.
Chris Prince

ใช้งานได้ดีกับ iOS 13
ttorbik

อันนี้ควรเป็นคำตอบ ทำงานได้อย่างมีเสน่ห์ใน iOS 13
COVID19

63

วิธีที่รวดเร็วในการทำ:

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

UINavigationBar.appearance().shadowImage = UIImage()

2
มันค่อนข้างยากที่จะทำให้เรื่องนี้อยู่ในรายการก่อนที่จะหาคำตอบที่ดีที่สุด +1!
sudo ทำการติดตั้ง

3
มันซ่อนพื้นหลังทั้งหมดของ UINavigationBar สรรพสินค้าใหญ่: /
365314

ผิดมันซ่อนพื้นหลังทั้งหมดด้วยเช่นกัน!
TomSawyer

3
หมายเหตุ: คุณต้องตั้งค่าการนำทางของแถบกระจกเป็นเท็จ
dmathewwws

19

ทางออกที่ง่ายในรวดเร็ว

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

3
+1 จากคำตอบทั้งหมดนี่คือสิ่งที่ใช้งานได้ในที่สุด มันไม่ได้ทำให้แถบสถานะเป็นคำตอบอื่น ๆ และทำให้ปัญหาในการเปลี่ยนแถบควบคุมการนำทางเพียงอันเดียวไม่ใช่แถบการนำทางทั้งหมดในโครงการ
JoeGalind

Swift 4.2 version: navigationBar? .setBackgroundImage (UIImage (), สำหรับ: UIBarPosition.any, barMetrics: UIBarMetrics.default) navigationBar? .shadowImage = UIImage ()
airowe

16

หลังจากศึกษาคำตอบจาก Serhil ฉันสร้าง pod UINavigationBar + Additionที่สามารถซ่อนเส้นผมได้ง่าย

#import "UINavigationBar+Addition.h"

- (void)viewDidLoad {
    [super viewDidLoad];

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

16

ใน Swift 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 จะมี API ของระบบสำหรับตั้งค่าหรือลบเงา

UIKit ใช้ shadowImage และคุณสมบัติ shadowColor เพื่อกำหนดลักษณะที่ปรากฏของเงา เมื่อ shadowImage เป็นศูนย์แถบจะแสดงเงาเริ่มต้นที่ย้อมสีตามค่าในคุณสมบัติ shadowColor หาก shadowColor เป็นศูนย์หรือมีสี clearColor แถบจะไม่แสดงเงา

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

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


shadowImage และ shadowColor ไม่มีการบันทึกไว้ในUINavigationBarAppearanceส่วนหัว !! ฉันไม่เคยพบมัน ขอบคุณสิ่งนี้แก้ปัญหาของฉันได้ 100%
Roger Oba

1
ใช่มันใช้งานได้ดีสำหรับฉันด้วยใน iOS 13 ขอบคุณมาก @glotcha
Yogesh Patel

@glotcha Right ....
Digvijay

ขอบคุณ สิ่งเดียวที่ใช้ได้ผลสำหรับฉัน
alionthego

13

สามารถซ่อนจาก Storyboard ได้ (ทำงานกับ Xcode 10.1)

โดยการเพิ่มคุณสมบัติ runtime: hidesShadow - Boolean - True

ป้อนคำอธิบายรูปภาพที่นี่


11

โซลูชันของ pxpgraphics ได้รับการอัปเดตสำหรับ Swift 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 และพยายามสอนตัวเอง ฉันจะใช้ส่วนขยายได้อย่างไร ฉันมีไฟล์ตัวควบคุมมุมมองและฉันใส่ส่วนขยายเหล่านี้ไว้นอกขอบเขตของคลาส แต่ฉันจะเรียก hide / showHairline () ได้อย่างไร? ไม่เข้าใจวิธีใช้ส่วนขยาย แต่ใช้สำหรับโซลูชันจำนวนมาก แต่ฉันไม่เข้าใจว่าจะใช้งานอย่างไรในรหัสจริง
Tommy K

ส่วนขยายเพิ่มฟังก์ชันการทำงานให้กับคลาสที่มีอยู่ของคุณ คลาส, โครงสร้าง, enum และอื่น ๆ จะมีคุณสมบัติใหม่เหล่านี้ให้คุณทุกครั้งที่คุณต้องการใช้ ดูเพิ่มเติมได้ที่นี่: developer.apple.com/library/ios/documentation/Swift/Conceptual/…
tf.alves

หืมดังนั้นฉันควรจะใช้UINavigationController().navigationBar/toolbar.hide/showBottomHairline()ไม่ได้ ฉันพยายามทำอย่างนี้ แต่ก็ไม่มีประโยชน์ ฉันไม่เข้าใจอย่างถูกต้องหรือไม่
Tommy K


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เป็น int ที่ไม่ซ้ำกัน (ถือว่าเป็นตัวชี้) เพื่อระบุวัตถุที่เกี่ยวข้องของคุณ ที่นี่ถูกกำหนดโดยที่อยู่หน่วยความจำของ var ส่วนตัว ฉันอัปเดตการตอบสนองเพื่อเพิ่ม var นี้ ดูnshipster.com/associated-objectsสำหรับข้อมูลเพิ่มเติม
Alvivi

วิธีแก้ปัญหาที่ดี แต่ใช้งานได้เฉพาะเมื่อแถบนำทางตั้งค่าtranslucentเป็นเท็จ
ZYiOS

9

Swift 4 ผ่านการทดสอบ ONE LINE SOLUTION

ในการViewdidload() ตั้งค่าเริ่มต้นของผู้ใช้ตัวควบคุมค่าเริ่มต้นจริงสำหรับคีย์ "hidesShadow"

override func viewDidLoad() {
    super.viewDidLoad()

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

}

1
ทำงานได้อย่างสมบูรณ์ !!
Prashant Tukadiya

7

Swift ใส่สิ่งนี้

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

ใน

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

และจะลบสีพื้นหลังด้วย
TomSawyer

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()

}

ขอบคุณเจมส์! ฉันไม่เข้าใจว่าทำไมใครบางคนโหวตให้คำตอบของคุณ
Dănuț Mihai Florian

ถ้าคุณต้องการคุณยังสามารถเพิ่ม: self.navigationController.navigationBar.translucent = false self.navigationController.navigationController.navigationBar.clipsToBounds = เท็จ self.navigationBar.shadowImage = UIImage () ()
Alessandro Ornano

5

โซลูชันในSwift 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

ใช้งานได้ดี ฉันตั้งไว้ในกระดานเรื่องราวด้วยดังนั้นไม่ต้องใช้รหัสใด ๆ
vikzilla

1
การทำเช่นนี้จะช่วยให้คุณมีเส้นสีขาวเล็ก ๆ แทนเงามาตรฐาน
Vegard

4

โซลูชันสองบรรทัดที่เหมาะกับฉัน ลองเพิ่มสิ่งนี้ในวิธีการ ViewDidLoad:

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

สิ่งนี้ใช้ได้กับฉันเท่านั้น
Usama bin Attique


3

วิธีง่ายๆ - Swift 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

สำหรับผู้ใช้ iOS 9 สิ่งนี้ใช้ได้สำหรับฉัน เพียงเพิ่มสิ่งนี้:

UINavigationBar.appearance().shadowImage = UIImage()

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)

ฉันไม่อยากจะเชื่อว่านี่ยังเป็นปัญหาอยู่ - เพิ่งเจอมันอีกครั้ง! แต่วิธีนี้เป็นวิธีที่ดีที่สุดในขณะนี้ ขอบคุณ @ โซเชต
RichAppz

1

ฉันรู้ว่านี่เป็นเธรดเก่า แต่ฉันพบวิธีแก้ปัญหาที่ใช้งานได้ดีจริง ๆ :

คลาสย่อย UINavigationBar ในคลาสย่อย UINavigationBar ของคุณให้แทนที่ didAddSubview ด้วยโค้ดต่อไปนี้:

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

ยังไม่ได้จัดการเพื่อนำสิ่งที่แตกต่างไปจาก VC เฉพาะ แต่จะช่วย 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];
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.