510

我有一个应用程序,有时需要它的导航栏与内容融合。

有谁知道如何摆脱这个烦人的小酒吧或改变它的颜色?

在下图中我的情况 - 我说的是“根视图控制器”下方的这条 1px 高度线

在此处输入图像描述

4

49 回答 49

857

对于 iOS 13:

使用.shadowColor物业

如果此属性为 nil 或包含清除颜色,则条形图不显示阴影

例如:

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

对于 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. 使用下面描述的“hacky”方法。它也将保持酒吧半透明。

如何保持条形半透明?##

为了保持半透明,你需要另一种方法,它看起来像一个 hack,但效果很好。我们试图移除的阴影是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 的原创想法!

于 2013-10-07T14:14:30.760 回答
271

这是黑客。由于它适用于关键路径,因此将来可能会中断。但现在它按预期工作。

迅速:

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

目标 C:

[self.navigationController.navigationBar setValue:@(YES) forKeyPath:@"hidesShadow"];
于 2016-08-03T13:43:23.290 回答
147

如果您只想使用纯色导航栏颜色并在情节提要中进行了设置,请在您的AppDelegate类中使用此代码通过外观代理删除 1 像素边框:

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

[[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]];
于 2013-10-27T09:48:00.717 回答
104

尝试这个:

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

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

下图有解释(iOS7 NavigationBar):

在此处输入图像描述

并检查这个 SO 问题: iOS7 - 更改 UINavigationBar 边框颜色

于 2013-10-07T14:06:20.213 回答
70

快速的方法:

UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .any, barMetrics: .default)
UINavigationBar.appearance().shadowImage = UIImage()
于 2015-04-10T16:08:51.470 回答
65

想添加 Serhii 答案的 Swift 版本。我创建了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
    }
}
于 2014-07-26T19:44:38.850 回答
24

快速简单的解决方案

   let navigationBar = self.navigationController?.navigationBar
    navigationBar?.setBackgroundImage(UIImage(), forBarPosition: UIBarPosition.Any, barMetrics: UIBarMetrics.Default)
    navigationBar?.shadowImage = UIImage()
于 2015-11-02T12:01:48.550 回答
19

从 iOS 13 开始,有一个系统 API 可以设置或移除阴影

UIKit 使用 shadowImage 和 shadowColor 属性来确定阴影的外观。当 shadowImage 为 nil 时,栏显示根据 shadowColor 属性中的值着色的默认阴影。如果 shadowColor 为 nil 或包含 clearColor 颜色,则条形图不显示阴影。

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

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

于 2019-06-23T08:01:00.127 回答
17

也可以从 Storyboard 中隐藏(在 Xcode 10.1 上工作)

通过添加运行时属性:hidesShadow - Boolean - True

在此处输入图像描述

于 2019-01-11T01:08:49.713 回答
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)
于 2017-02-11T20:16:46.653 回答
15

在研究了 Serhil 的答案后,我创建了一个可以轻松隐藏发际线的 pod UINavigationBar+Addition 。

#import "UINavigationBar+Addition.h"

- (void)viewDidLoad {
    [super viewDidLoad];

    UINavigationBar *navigationBar = self.navigationController.navigationBar;
    [navigationBar hideBottomHairline];
}
于 2014-03-14T07:13:38.107 回答
12

Swift 4 //用于隐藏导航栏阴影线

navigationController?.navigationBar.shadowImage = UIImage()
于 2017-12-04T05:12:13.973 回答
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
    }

}
于 2015-07-13T10:50:18.963 回答
10

Swift 4 测试 的单线解决方案

Viewdidload() 为键“hidesShadow”设置导航控制器的用户默认值 true

override func viewDidLoad() {
    super.viewDidLoad()

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

}
于 2018-11-15T06:34:01.847 回答
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

或者您可以使用情节提要启用/禁用此行为:

导航栏故事板

于 2015-08-04T21:10:54.143 回答
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
于 2014-12-05T06:44:57.120 回答
7

斯威夫特把这个

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

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool
于 2016-02-02T10:44:42.350 回答
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()

}
于 2015-04-01T17:12:18.127 回答
5

Swift 4.2中的解决方案:

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

只需将这个函数放在第一个 Viewcontroller 并调用它viewdidload

于 2019-02-24T14:04:02.753 回答
5

适合我的两行解决方案。尝试在 ViewDidLoad 方法中添加它:

navigationController?.navigationBar.setValue(true, forKey: "hidesShadow")
self.extendedLayoutIncludesOpaqueBars = true
于 2019-07-11T09:04:50.040 回答
4

这是一个非常简单的解决方案:

self.navigationController.navigationBar.clipsToBounds = YES;
于 2015-02-06T09:39:54.637 回答
4

在 iOS8 中,如果设置为 ,则UINavigationBar.barStyle可以.Black将栏的背景设置为无边框的纯色。

在斯威夫特:

UINavigationBar.appearance().translucent = false
UINavigationBar.appearance().barStyle = UIBarStyle.Black
UINavigationBar.appearance().barTintColor = UIColor.redColor()
于 2015-07-20T17:19:08.747 回答
4

简单的解决方案——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)
    
于 2019-07-10T11:51:10.737 回答
3

对于 iOS 13+

诀窍是用'UINavigationBarAppearance'初始化TransparentBackground。然后您可以轻松删除导航栏的水平线。

let appearance = UINavigationBarAppearance()
appearance.configureWithTransparentBackground()
appearance.backgroundColor = .green // Required background color

最后,按照苹果的建议将外观更改添加到导航项。

self.navigationItem.standardAppearance = appearance
self.navigationItem.scrollEdgeAppearance = appearance
self.navigationItem.compactAppearance = appearance
于 2021-12-13T11:25:52.287 回答
2

设置背景图像的问题在于它消除了模糊。您可以在不设置背景图像的情况下将其删除。在这里查看我的答案。

于 2013-10-27T10:06:22.443 回答
2

对于 iOS 9 用户,这对我有用。只需添加以下内容:

UINavigationBar.appearance().shadowImage = UIImage()
于 2016-07-01T17:25:56.293 回答
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)
于 2017-01-10T02:32:55.610 回答
2

pxpgraphics 对 Swift 3.0 的回答。

import Foundation
import UIKit

extension UINavigationBar {

  func hideBottomHairline() {
    let navigationBarImageView = hairlineImageViewInNavigationBar(view: self)
    navigationBarImageView!.isHidden = true
  }

  func showBottomHairline() {
    let navigationBarImageView = hairlineImageViewInNavigationBar(view: self)
    navigationBarImageView!.isHidden = false
  }

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

    let subviews = (view.subviews as [UIView])
    for subview: UIView in subviews {
      if let imageView: UIImageView = hairlineImageViewInNavigationBar(view: subview) {
        return imageView
      }
    }
    return nil
  }
}

extension UIToolbar {

  func hideHairline() {
    let navigationBarImageView = hairlineImageViewInToolbar(view: self)
    navigationBarImageView!.isHidden = true
  }

  func showHairline() {
    let navigationBarImageView = hairlineImageViewInToolbar(view: self)
    navigationBarImageView!.isHidden = false
  }

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

    let subviews = (view.subviews as [UIView])
    for subview: UIView in subviews {
      if let imageView: UIImageView = hairlineImageViewInToolbar(view: subview) {
        return imageView
      }
    }
    return nil
  }
}
于 2016-11-17T22:26:41.237 回答
1

这是一种不使用任何图像的方法,这是对我有用的唯一方法:

self.navigationController.navigationBar.layer.shadowOpacity = 0;

不幸的是,您需要在不希望该行出现的每个文件上执行此操作。没有办法在appDelegate.

编辑:

不需要设置shadowColorto nil,这是您唯一需要的行。

于 2018-08-15T22:03:12.580 回答
1

不使用非常重要,navigationController?.navigationBar.setValue(true, forKey: "hidesShadow")因为在任何时候,Apple 都可以删除“hidesShadow”密钥路径。如果他们这样做,任何使用此调用的应用程序都会中断。由于您没有访问类的直接 API,因此此调用可能会遭到 App Store 拒绝。

从 iOS 13 开始,为确保效率,您可以执行以下操作:

navigationBar.standardAppearance.shadowColor = nil

于 2020-11-23T06:39:28.250 回答
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
    }


}
于 2015-07-16T17:56:11.457 回答
1

目标 C 对上述问题的回答

// 删除导航栏的 1px 行

[[UINavigationBar appearance] setBackgroundImage:[[UIImage alloc]init] forBarMetrics:UIBarMetricsDefault];
[[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]];
[[UINavigationBar appearance] setTranslucent:NO];
[[UINavigationBar appearance] setTintColor:[UIColor yourColor]];
于 2016-11-05T10:35:37.140 回答
1
-(void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    UIImage *emptyImage = [UIImage new];
    self.navigationController.navigationBar.shadowImage = emptyImage;
    [self.navigationController.navigationBar setBackgroundImage:emptyImage forBarMetrics:UIBarMetricsDefault];
}
于 2016-05-11T14:21:57.187 回答
1

我遇到了同样的问题,没有一个答案是真正令人满意的。这是我对 Swift3 的看法:

func hideNavigationBarLine() {
    navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
    navigationController?.navigationBar.shadowImage = UIImage()
}

只需从viewDidLoad()中调用它。

于 2017-08-24T20:43:56.397 回答
1

Swift 3中,我们这样做

对于任何视图控制器:

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

对于整个应用程序:

UINavigationBar.appearance().setBackgroundImage(UIImage(),barMetrics: .Default)
UINavigationBar.appearance().shadowImage = UIImage()
于 2017-06-02T10:51:14.980 回答
1
        if #available(iOS 13.0, *) {
            let appearance = UINavigationBarAppearance()
            appearance.backgroundColor          = Colors.color_app
            appearance.titleTextAttributes      = [.foregroundColor : UIColor.white]
            appearance.largeTitleTextAttributes = [.foregroundColor : UIColor.white]
            appearance.shadowColor = .clear
            appearance.shadowImage = UIImage()
            
            UINavigationBar.appearance().tintColor            = .white
            UINavigationBar.appearance().standardAppearance   = appearance
            UINavigationBar.appearance().compactAppearance    = appearance
            UINavigationBar.appearance().scrollEdgeAppearance = appearance
        } else {
            UINavigationBar.appearance().barTintColor        = Colors.color_app
            UINavigationBar.appearance().tintColor           = .white
            UINavigationBar.appearance().titleTextAttributes = [NSAttributedString.Key.foregroundColor : UIColor.white]
            if #available(iOS 11.0, *) {
                UINavigationBar.appearance().largeTitleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
            }
            UINavigationBar.appearance().isTranslucent = false
            
            UINavigationBar.appearance().shadowImage = UIImage()
            UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default)
        }
于 2020-07-12T23:35:13.553 回答
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% 的人

于 2016-05-20T15:21:26.423 回答
0

这听起来可能很愚蠢,但只有当 viewController 的视图的背景颜色设置为任何颜色(但白色除外)时,才会出现此细线。得知这一事实后,我感到震惊。

因此,如果您希望它消失而没有太多麻烦,只需将控制器的视图背景颜色设置为白色。

于 2014-02-19T18:58:14.447 回答
0

我知道这是一个旧线程,但我找到了一个非常有效的解决方案:

子类 UINavigationBar。在您的 UINavigationBar 子类中,使用以下代码覆盖 didAddSubview:

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

    if ([subview isKindOfClass:[UIImageView class]]) {
        [subview setClipsToBounds:YES];
    }
}
于 2014-04-21T22:06:33.453 回答
0
[tabviewController.view setBackgroundColor:[UIColor blackColor]];

为我做的[UIColor blackColor]可能是你的背景颜色,如果你正在使用它tabviewController是你的!UITabBarController

于 2015-01-05T13:02:39.783 回答
0

我的做法:

UINavigationBar.appearance().setBackgroundImage(
            UIImage(),
            forBarPosition: .Any,
            barMetrics: .Default)
    var _width:CGFloat! = self.navigationController?.navigationBar.layer.frame.width
            var _height:CGFloat! = self.navigationController?.navigationBar.layer.frame.height
            var navBarBg = UIView(frame:CGRectMake(0, 0, _width, _height))
            //solid color for bg
            navBarBg.backgroundColor = UIColor.orangeColor()
            view.addSubview(navBarBg)
于 2015-06-10T06:55:05.807 回答
0

Xamarin Forms中,这对我有用。只需在 AppDelegate.cs 上添加:

UINavigationBar.Appearance.ShadowImage = new UIImage();
于 2017-11-03T22:58:12.313 回答
0

这是另一种选择-我认为这仅在您不需要导航栏半透明的情况下才有效(我没有)。我刚刚在导航栏底部(导航栏下方 1 个像素)添加了一个 1 像素高的 UIView,其颜色与我的导航栏相同:

UIView *view = [[UIView alloc] init];
[view setBackgroundColor:self.navigationController.navigationBar.barTintColor];
[self.navigationController.navigationBar addSubview:view];
[view mas_makeConstraints:^(MASConstraintMaker *make) {
    make.height.equalTo(@(1.0f));
    make.leading.trailing.equalTo(self.navigationController.navigationBar);
    make.bottom.equalTo(self.navigationController.navigationBar).offset(1.0f);
}];

我正在使用 Masonry 添加约束。

于 2015-09-28T18:25:51.557 回答
0

嗨,这适用于 Swift 4。

    override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    self.navigationController?.navigationBar.shadowImage = UIImage()
    self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
    self.navigationController?.navigationBar.isTranslucent = false
}

你需要把它放在 viewDidLayoutSubviews 而不是 viewDidLoad

于 2017-12-05T03:38:38.913 回答
0

编写自己的初始化程序:D

import Foundation
import UIKit

extension UINavigationController {
    convenience init(rootViewController : UIViewController, hidesShadow : Bool) {
        self.init(rootViewController : rootViewController)
        self.navigationBar.setValue(hidesShadow, forKey: "hidesShadow")
        if hidesShadow {
            self.extendedLayoutIncludesOpaqueBars = true
            self.navigationBar.isTranslucent = false 
        }
    }
}
于 2020-10-13T06:27:02.267 回答
0

在子视图中查找细线的一个不错的简短 Swift 函数是:

 func findHairLineInImageViewUnder(view view: UIView) -> UIImageView? {
    if let hairLineView = view as? UIImageView where hairLineView.bounds.size.height <= 1.0 {
        return hairLineView
    }

    if let hairLineView = view.subviews.flatMap({self.findHairLineInImageViewUnder(view: $0)}).first {
      return hairLineView
    }

    return nil
}
于 2016-06-30T12:16:09.067 回答
0

这里有一个非常重要的注意事项 - 更改UIViewController's的外观navigationItemnavigationBar直接更改 's 的外观要灵活得多。

你为什么问?

原因很简单,navigationItem它与一个单一的UIViewController并代表该navigationBar特定的状态UIViewController。这很大,因为您不必处理内部viewWillAppear(或类似的)不同视图控制器之间的导航栏更改,就像您对navigationBar;进行突变一样。请记住,它在给定导航堆栈 ( ) 的所有视图控制器之间共享UINavigationController,并且在一个地方更改它会更改所有视图控制器到堆栈的所有视图控制器。

您只需UINavigationBarAppearance为特定的视图控制器设置正确的值,UIKit 将正确更新导航栏样式,具体取决于哪个视图控制器当前是导航堆栈上的顶部视图控制器。

navigationItem.standardAppearance` = `UINavigationBarAppearance()
于 2021-06-03T11:03:54.563 回答
0

酒吧风格的黑色为我做到了。

[[UINavigationBar appearance] setBarStyle:UIBarStyleBlack];

我拥有的所有属性(以防万一):

    [[UINavigationBar appearance] setBarTintColor:color];
    [[UINavigationBar appearance] setTranslucent:NO];
    [[UINavigationBar appearance] setShadowImage:[UIImage new]];
    [[UINavigationBar appearance] setBarStyle:UIBarStyleBlack];
于 2015-12-10T23:10:59.477 回答
0

对我有用且最简单的方法是创建一个具有所需颜色的 png(它只需要一个像素乘一个像素的尺寸),然后将 backgroundImage 和 shadowImage 设置为:

let greenPixel = UIImage(named: "TheNameOfYourPng")
navigationBar.setBackgroundImage(greenPixel, forBarMetrics: UIBarMetrics.Default)
navigationBar.shadowImage = greenPixel
于 2016-06-08T18:44:33.620 回答