Cách ẩn dòng dưới cùng của UINavestionBar 1px


443

Tôi có một ứng dụng đôi khi cần thanh điều hướng của nó để hòa trộn với nội dung.

Có ai biết làm thế nào để thoát khỏi hoặc thay đổi màu sắc của thanh nhỏ phiền phức này?

Trên hình ảnh bên dưới tình huống tôi có - tôi đang nói về dòng chiều cao 1px này bên dưới "Root View Controller"

nhập mô tả hình ảnh ở đây



Làm thế nào để tăng 1px chiều cao điều hướng?
Suresh Durishetti

Câu trả lời:


738

Dành cho iOS 13:

Sử dụng .shadowColortài sản

Nếu thuộc tính này là không hoặc chứa màu rõ ràng, thanh sẽ không hiển thị bóng

Ví dụ:

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

Dành cho iOS 12 trở xuống:

Để làm điều này, bạn nên đặt một hình ảnh bóng tùy chỉnh. Nhưng để hình ảnh bóng được hiển thị, bạn cũng cần đặt hình nền tùy chỉnh, trích dẫn từ tài liệu của Apple:

Để hình ảnh bóng tùy chỉnh được hiển thị, hình ảnh nền tùy chỉnh cũng phải được đặt bằng phương thức setBackgroundImage (_: for :). Nếu hình nền mặc định được sử dụng, thì hình ảnh bóng mặc định sẽ được sử dụng bất kể giá trị của thuộc tính này.

Vì thế:

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

Trên đây là cách "chính thức" duy nhất để che giấu nó. Thật không may, nó loại bỏ độ trong của thanh.

Tôi không muốn hình nền, chỉ là màu sắc

Bạn có những lựa chọn đó:

  1. Màu đặc, không trong mờ:

    navigationBar.barTintColor = UIColor.redColor()
    navigationBar.isTranslucent = false
    navigationBar.setBackgroundImage(UIImage(), for: .default)
    navigationBar.shadowImage = UIImage()
    
  2. Tạo hình nền nhỏ chứa đầy màu sắc và sử dụng nó.

  3. Sử dụng phương pháp 'hacky' được mô tả dưới đây. Nó cũng sẽ giữ thanh mờ.

Làm thế nào để giữ thanh mờ?

Để giữ độ trong mờ bạn cần một cách tiếp cận khác, nó trông giống như một bản hack nhưng hoạt động tốt. Cái bóng chúng tôi đang cố xóa là một đường chân tóc UIImageViewở đâu đó bên dưới UINavigationBar. Chúng ta có thể tìm thấy nó và ẩn / hiển thị nó khi cần thiết.

Các hướng dẫn bên dưới giả sử bạn chỉ cần đường viền tóc ẩn trong một bộ điều khiển của UINavigationControllerhệ thống phân cấp.

  1. Khai báo biến đối tượng:

    private var shadowImageView: UIImageView?
  2. Thêm phương thức tìm thấy bóng này (chân tóc) 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. Thêm / chỉnh sửa viewWillAppear/viewWillDisappearphương thức:

    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
    }
    

Phương pháp tương tự cũng sẽ có hiệu quả đối với UISearchBarchân tóc, và (hầu như) bất cứ điều gì khác mà bạn cần ẩn :)

Rất cám ơn @Leo Natan cho ý tưởng ban đầu!


103
Bạn cũng có thể chỉ cần đặt chế độ xem của UINavigationBartài sản:clipsToBounds = YES
smartbit

3
@richarddas clipsToBounds = YEShoạt động như một lá bùa! Cảm ơn!
romeouald

3
Các clipToBound không phải lúc nào cũng hoạt động đối với một số bố cục. Câu trả lời này làm việc hoàn hảo cho tôi. Chỉ có tôi tạo một lớp con UINavestionBar và sử dụng đoạn mã trên để ẩn hình ảnh bóng trong các phương thức -layoutSubview. Cảm ơn!
cgossain

7
Chỉ cần lưu ý rằng tôi đã gặp sự cố khi thanh trạng thái hàng đầu iOS của tôi trở nên trong mờ và tôi có thể thấy chế độ xem bảng của mình cuộn phía sau UINavestionBar. Tôi đã sửa lỗi này bằng cách đặt setTranslucent = NO.
Vlad

2
Trong iOS 10, dường như khi viewWillAppear được gọi, chúng tôi không thể nhận đượcshadowImageView
xi.lin

241

Dưới đây có thể giúp đơn giản!

Nhanh:

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

Mục tiêu C:

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

6
Tôi đang sử dụng Xcode 8 và nhà phát triển cho> iOS 8 và không có tính năng nào ở trên hoạt động cho tôi ngoại trừ cái này.
Vakas

2
Ngoài ra trên XCode 8 và> iOS 8. Đây là câu trả lời duy nhất phù hợp với tôi.
đám mây

1
Đây là câu trả lời ngắn và đơn giản duy nhất phù hợp với tôi cho iOS 10 và Xcode 8.3.1. Cảm ơn người đàn ông.
Vishal Sonawane

1
Mục tiêu-C: self.navlationControll.navlationBar.shadowImage = [UIImage new];
Marcelo dos Santos

1
Chỉ điều này hoạt động với tôi trong iPad phiên bản iOS 13.3.1.
Ravi

145

Nếu bạn chỉ muốn sử dụng màu thanh điều hướng chắc chắn và đã thiết lập màu này trong bảng phân cảnh của mình, hãy sử dụng mã này trong AppDelegatelớp của bạn để xóa viền 1 pixel thông qua proxy xuất hiện:

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

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

2
Điều này đặt nó toàn cầu cho MỌI thanh điều hướng trong cơ sở mã của bạn ... hầu hết các lần không phải là điều bạn muốn.
Christoph

97

Thử cái này:

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

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

Hình ảnh bên dưới có lời giải thích (NavigationBar iOS7):

nhập mô tả hình ảnh ở đây

Và kiểm tra câu hỏi SO này: iOS7 - Thay đổi màu đường viền UINavestionBar


Như Serhii đã nói, một hình nền tùy chỉnh phải được đặt để hình ảnh bóng được chấp nhận.
akashivskyy

3
làm điều này trong AppDelegate của bạn.
myusuf3

Câu trả lời tuyệt vời ... Đã cứu ngày của tôi _ / \ _
Akshay

@RPM Hoạt động tuyệt vời trong iOS 7,8,9,10. Có cùng mã cho thanh điều hướng của viewControlles trong phương tiện cho Swift.
Akhrameev

64

Muốn thêm phiên bản Swift của câu trả lời của Serhii. Tôi đã tạo một UIBarExtension.swiftvới những điều sau đây:

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

Cảm ơn bạn! Điều này nên là câu trả lời.
PeiweiChen

Nó hoạt động với navigationBar nhưng không hoạt động với uitoolbar
TomSawyer

Tôi đang tìm kiếm với iOS 12, điều này không còn hoạt động nữa. :(.
Chris Prince

Hoạt động tốt trên iOS 13
ttorbik

Điều này nên là câu trả lời. hoạt động như bùa mê trong ios 13
COVID19

63

Cách nhanh chóng để làm điều đó:

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

UINavigationBar.appearance().shadowImage = UIImage()

2
Rất hiếm khi đưa danh sách này đi xa khỏi danh sách trước khi tìm ra câu trả lời đẹp nhất. +1!
sudo thực hiện cài đặt

3
Nó ẩn toàn bộ nền của
UINavulationBar

Sai, nó che giấu toàn bộ nền quá!
TomSawyer

3
Lưu ý: bạn phải đặt điều hướng của isBanslucent thành false
dmathewwws

19

Giải pháp đơn giản trong nhanh chóng

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

3
+1 Trong tất cả các câu trả lời, đây là những gì cuối cùng đã làm việc cho tôi. Nó không làm rối thanh trạng thái như các câu trả lời khác và nó giải quyết vấn đề chỉ thay đổi một trong các thanh điều khiển điều hướng, không phải tất cả các thanh điều hướng trong dự án.
JoeGalind

Phiên bản Swift 4.2: navigationBar? .SetBackgroundImage (UIImage (), for: UIBarPocation.any, barMetrics: UIBarMetrics.default) navigationBar? .ShadowImage = UIImage ()
airowe 19/07/19

16

Sau khi nghiên cứu câu trả lời từ Serhil, tôi đã tạo ra một pod UINavestionBar + Bổ sung có thể dễ dàng che giấu đường chân tóc.

#import "UINavigationBar+Addition.h"

- (void)viewDidLoad {
    [super viewDidLoad];

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

16

Trong Swift 3.0

Chỉnh sửa của bạn AppDelegate.swiftbằng cách thêm mã sau vào chức năng ứng dụng của bạn:

// Override point for customization after application launch.

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

16

Kể từ iOS 13, có một API hệ thống để đặt hoặc xóa bóng

UIKit sử dụng ShadowImage và thuộc tính ShadowColor để xác định diện mạo của bóng. Khi ShadowImage là 0, thanh hiển thị một bóng mặc định được tô màu theo giá trị trong thuộc tính ShadowColor. Nếu ShadowColor là nil hoặc chứa màu ClearColor, thanh sẽ không hiển thị bóng.

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

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


ShadowImage và ShadowColor không được ghi lại trong UINavigationBarAppearancecác tiêu đề !! Tôi sẽ không bao giờ tìm thấy nó. Cảm ơn, điều này đã giải quyết vấn đề của tôi 100%
Roger Oba

1
Có, nó cũng hoạt động tốt với tôi trong iOS 13, cảm ơn bạn rất nhiều @glotcha.
Yogesh Patel

@glotcha Phải ....
Digvijay

cảm ơn. điều duy nhất làm việc cho tôi
alionthego

13

Cũng có thể bị ẩn khỏi Storyboard (hoạt động trên Xcode 10.1)

Bằng cách thêm thuộc tính thời gian chạy: hidesShadow - Boolean - True

nhập mô tả hình ảnh ở đây


11

giải pháp của pxpgraphics được cập nhật cho 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
    }

}

Xin chào, mới dùng iOS và cố gắng dạy bản thân. Làm cách nào để sử dụng tiện ích mở rộng? Tôi có một tệp điều khiển xem và tôi đặt các phần mở rộng này bên ngoài phạm vi lớp. Nhưng sau đó, làm thế nào để tôi gọi ẩn / showHairline ()? Không thực sự hiểu cách sử dụng các tiện ích mở rộng nhưng nó được sử dụng cho rất nhiều giải pháp, nhưng tôi chỉ không hiểu cách chúng được triển khai trong mã thực tế
Tommy K

Các phần mở rộng thêm chức năng cho các lớp hiện có của bạn. Bất kỳ lớp mở rộng, cấu trúc, enum, v.v., sẽ có sẵn các tính năng mới này cho bạn bất cứ khi nào bạn cần sử dụng chúng. Xem thêm tại đây: developer.apple.com/l
Library / ios / document / Swift / Conceptionual / từ

hm vậy tôi có thể dùng được UINavigationController().navigationBar/toolbar.hide/showBottomHairline()không? Tôi đang thử điều này nhưng vô ích. Tôi không hiểu chính xác?
Tommy K

11

Swift 4 // để ẩn dòng bóng thanh điều hướng

navigationController?.navigationBar.shadowImage = UIImage()

10

Tôi sử dụng tiện ích mở rộng UINavestionBar cho phép tôi ẩn / hiển thị bóng đó bằng API UIAppparent hoặc chọn thanh điều hướng phải ẩn / hiển thị bóng đó bằng Storyboard (hoặc mã nguồn). Đây là phần mở rộng:

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

Bây giờ, để tắt bóng trên tất cả các thanh điều hướng bạn phải sử dụng:

UINavigationBar.appearance().flat = true

Hoặc bạn có thể bật / tắt hành vi này bằng bảng phân cảnh:

Bảng điều hướng Bar


@ NunoGonçalves, bạn có thể nghĩ về flatAssociatedObjectKeymột int duy nhất (được coi là con trỏ) để xác định đối tượng liên quan của bạn. Ở đây được xác định bởi địa chỉ bộ nhớ của một var riêng. Tôi đã cập nhật các phản hồi để thêm var này. Xem nshipster.com/associated-objects để biết thêm thông tin.
Alvivi

Giải pháp tốt nhưng chỉ hoạt động khi thanh điều hướng được đặt translucentthành false
ZYiOS

9

Swift 4 đã thử nghiệm GIẢI PHÁP MỘT LINE

Trong Viewdidload() Đặt giá trị giá trị người dùng của bộ điều khiển Điều hướng đúng cho khóa "hidesShadow"

override func viewDidLoad() {
    super.viewDidLoad()

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

}

1
Làm việc hoàn hảo !!
Prashant Tukadiya

7

Swift đặt cái này

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

trong

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

Và nó cũng loại bỏ màu nền.
TomSawyer

7

Một tùy chọn khác nếu bạn muốn duy trì độ trong mờ và bạn không muốn phân lớp mỗi UINavigationControllertrong ứng dụng của mình:

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

}

Cảm ơn James! Tôi không thể hiểu tại sao ai đó xuống bình chọn câu trả lời của bạn.
Dănuț Mihai Florian

nếu bạn cần nó, bạn cũng có thể thêm: self.navlationContoder.navlationBar.translucent = false self.navlationContoder.navlationBar.clipsToBound = false self.navlationContoder.navlationBar.shadowImage =. ()
Alessandro Ornano

5

Giải pháp trong Swift 4.2:

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

Chỉ cần đặt chức năng này tại Trình điều khiển đầu tiên và gọi nó vào viewdidload


4

Trong iOS8, nếu bạn thiết lập UINavigationBar.barStyleđể .Blackbạn có thể đặt nền của thanh như màu đồng bằng mà không biên giới.

Trong Swift:

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

Đây là giải pháp sạch nhất và cách tốt nhất để thực hiện điều này. Nếu bạn không phải hỗ trợ <iOS 8, không có lý do gì để không sử dụng câu trả lời này. Cảm ơn.
dùng344977

Công trình tuyệt vời. Tôi cũng đặt nó trong bảng phân cảnh nên thậm chí không cần bất kỳ mã nào.
vikzilla

1
Làm điều này cung cấp cho bạn một đường trắng rất nhỏ thay vì bóng tiêu chuẩn.
Vegard

4

Hai dòng giải pháp phù hợp với tôi. Hãy thử thêm điều này trong phương thức ViewDidLoad:

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

chỉ điều này làm việc cho tôi
Usama bin Attique

3

Đây là một giải pháp rất đơn giản:

self.navigationController.navigationBar.clipsToBounds = YES;

37
Khu vực thanh trạng thái cũng được cắt bớt.
Fury

3

Giải pháp đơn giản - Swift 5

  1. Tạo tiện ích mở rộng:

    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. Thêm cái này vào viewDidLoad():

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

2

Đối với người dùng iOS 9, điều này làm việc cho tôi. chỉ cần thêm điều này:

UINavigationBar.appearance().shadowImage = UIImage()

2

Vấn đề với việc thiết lập một hình ảnh nền là nó loại bỏ mờ. Bạn có thể loại bỏ nó mà không cần thiết lập một hình ảnh nền. Xem câu trả lời của tôi ở đây .


2

Bạn nên thêm chế độ xem vào cuối 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)

Tôi không thể tin rằng đây vẫn là một vấn đề - chỉ cần gặp lại nó một lần nữa! Nhưng giải pháp này là giải pháp tốt nhất có thể tại thời điểm này; Cảm ơn @Socheat
RichAppz

1

Tôi biết đây là một chủ đề cũ, nhưng tôi đã tìm thấy một giải pháp hoạt động thực sự tốt:

Phân lớp UINavulationBar. Trong lớp con UINavlationBar của bạn, ghi đè didAddSubview bằng mã sau:

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

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

1

Tôi vừa tạo một tiện ích mở rộng cho việc này ... Xin lỗi về định dạng (đây là câu trả lời đầu tiên của tôi).

Sử dụng:

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

Sự mở rộng:

 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

Trong AppDelegate , điều này đã thay đổi toàn cầu định dạng của 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()] }

Không quản lý để thực hiện bất cứ điều gì khác nhau trên một VC cụ thể, nhưng điều này sẽ giúp 90% mọi người


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

    UIImage *emptyImage = [UIImage new];
    self.navigationController.navigationBar.shadowImage = emptyImage;
    [self.navigationController.navigationBar setBackgroundImage:emptyImage forBarMetrics:UIBarMetricsDefault];
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.