ios - 如何隐藏UINavigationBar 1px底线

我有一个应用程序,有时需要它的导航栏来融入内容。
有人知道如何摆脱或改变这个讨厌的小酒吧的颜色吗?
在下面的图片中,我有——我在谈论“根视图控制器”下面的1px高度线。


最佳答案:

为此,应设置自定义阴影图像。但对于要显示的阴影图像,您还需要设置自定义背景图像,引用苹果的文档:
要显示自定义阴影图像,自定义背景图像必须
也可以使用BackgroundImage(u:for:)方法进行设置。如果违约
使用背景图像,然后将使用默认的阴影图像
不考虑此属性的值。
所以:

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

上面是隐藏它的唯一“官方”方法。不幸的是,它消除了酒吧的半透明。
我不想要背景图像,只想要颜色
您可以选择:
纯色,无半透明:
navigationBar.barTintColor = UIColor.redColor()
navigationBar.isTranslucent = false
navigationBar.setBackgroundImage(UIImage(), for: .default)
navigationBar.shadowImage = UIImage()

创建充满颜色的小背景图像并使用它。
使用下面描述的“hacky”方法。它还可以保持条形半透明。
如何保持条形半透明?
为了保持半透明,你需要另一种方法,它看起来像一个黑客,但工作得很好。我们要去除的阴影是一条发际线UIImageView下面的某个地方。我们可以在需要时找到它并隐藏/显示它。
下面的说明假设您只需要在UINavigationBar层次结构的一个控制器中隐藏发线。
声明实例变量:
private var shadowImageView: UIImageView?

添加查找此阴影的方法(发际线)UINavigationController
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
}

添加/编辑方法:
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
}

同样的方法也适用于UIImageView:发际线,
还有(几乎)任何你需要隐藏的东西:)
多谢@leo natan的创意!