小编典典

如何隐藏 UINavigationBar 1px 底线

all

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

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

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

在此处输入图像描述


阅读 116

收藏
2022-03-11

共1个答案

小编典典

对于 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 的原创想法!

2022-03-11