【问题标题】:How to change the color of the bottom border of UINavigationBar?如何更改 UINavigationBar 下边框的颜色?
【发布时间】:2016-05-16 19:16:10
【问题描述】:

我阅读了很多帖子,但没有一个针对最新版本的 Swift 给出明确、一致的答案来解决这个问题。

例如,this question 的最佳答案建议 UINavigationBar.appearance().setShadowImage()。但是最新版的swift中不存在这样的方法。

不想隐藏底部边框。我只想改变颜色

此外,能够改变高度也很棒,但我知道我在一个问题上问的太多了。

编辑:我创建了一个 2x1 像素的图像并将其设置为 shadowImage,但边框保持不变:

UINavigationBar.appearance().barTintColor = UIColor.whiteColor()
UINavigationBar.appearance().shadowImage = UIImage(named: "border.jpg") //in my AppDelegate, for global appearance

这是图片;真的很小:

【问题讨论】:

  • 阴影图像依然存在,你必须在Swift中做UINavigationBar.appearance().shadowImage = ...
  • 有谁知道为什么自动完成不显示shadowImage? (但它确实存在,实际上)
  • 因为无法通过UINavigationBar.appearance()访问。
  • @ZGski 它是可访问的。我刚刚做到了,并且使用您的答案。
  • 我的回答使用navigationController?.navigationBar,而不是appearance()

标签: ios swift uinavigationcontroller uinavigationbar


【解决方案1】:

SWIFT 2.x:

为方便起见,我扩展了 UIImage() 以允许我基本上将其用作颜色,并使用下面的代码。

extension UIImage {
    class func imageWithColor(color: UIColor) -> UIImage {
        let rect = CGRectMake(0, 0, 1.0, 0.5)
        UIGraphicsBeginImageContextWithOptions(rect.size, false, 0)
        color.setFill()
        UIRectFill(rect)
        let image: UIImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image
    }
}

接下来,您需要在代码中添加以下行来调整 viewController 的 UINavigationBar 的阴影图像,或在此实例中的颜色。

// Sets Bar's Background Image (Color) //
self.navigationController?.navigationBar.setBackgroundImage(UIImage.imageWithColor(UIColor.blueColor()), forBarMetrics: .Default)
// Sets Bar's Shadow Image (Color) //
self.navigationController?.navigationBar.shadowImage = UIImage.imageWithColor(UIColor.redColor())

SWIFT 3.x / 4.x:

扩展代码:

extension UIImage {
    class func imageWithColor(color: UIColor) -> UIImage {
        let rect = CGRect(x: 0.0, y: 0.0, width: 1.0, height: 0.5)
        UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0)
        color.setFill()
        UIRectFill(rect)
        let image : UIImage = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()
        return image
    }
}

导航条码:

// Sets Bar's Background Image (Color) //
navigationController?.navigationBar.setBackgroundImage(UIImage.imageWithColor(color: .blue), for: .default)
// Sets Bar's Shadow Image (Color) //
navigationController?.navigationBar.shadowImage = UIImage.imageWithColor(color: .red)

编辑 1:

更新了扩展代码,因此您可以在不更改 UIImage 颜色不透明度的情况下调整矩形大小。

编辑 2:

添加了 Swift 3 + Swift 4 代码。

【讨论】:

  • 你知道吗,为什么我把你的矩形的高/宽改成0.5,颜色变了?
  • @TIMEX,我已经更新了我的代码,所以这不应该再发生了
  • 这确实有效,但我的应用程序内每个视图控制器上的阴影图像都会发生颜色变化。
  • @LanceSamaria 您需要重置您不想采用新外观的 navigationBar 属性,因为 NavigationController 是一个包含孩子们ViewControllers.
【解决方案2】:

UISomeClass.setSomething(whatIWantToSet) 这样的旧 UIKit setter 方法已经过重新设计,因此您可以直接使用 = 符号设置它们。因此,在我的示例中,您必须使用 UISomeClass.something = whatIWantToSet

在你的情况下,它是UINavigationBar.appearance().shadowImage = whatYouWantToSet

【讨论】:

    【解决方案3】:

    有点棘手的解决方案,但它无需编码和扩展即可工作。只需在您的导航栏下的 StoryBoard 中添加一个进度视图,并将其颜色和高度设置为您喜欢的任何内容。如果你想要完整的边框也将进度设置为 1。

    因此,您将获得适当的导航栏边框以及随时添加 progressView 的选项作为额外奖励。 我知道,我知道……这有点棘手,但程序员应该是懒惰的,不是吗?

    【讨论】:

      猜你喜欢
      • 2013-10-06
      • 1970-01-01
      • 1970-01-01
      • 2010-09-09
      • 2020-01-12
      • 2013-02-18
      • 1970-01-01
      • 2017-12-02
      相关资源
      最近更新 更多