如何隐藏UINavigationBar 1px底线

我有一个应用程序,有时需要其导航栏来融入内容。

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

在下面的图片我有 - 我在说“根视图控制器”下面的这个1px高度线,

在这里输入图像描述


要做到这一点,你应该设置一个自定义阴影图像。 但是为了显示阴影图像,您还需要设置一个自定义背景图像,引用Apple的文档:

要显示自定义阴影图像,还必须使用setBackgroundImage(_: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'方法。 它也会保持半透明。

  • 如何保持半透明?

    为了保持半透明性,你需要另一种方法,它看起来像一个黑客,但效果很好。 我们试图去除的阴影是UINavigationBar下的发际线UIImageView 。 我们可以找到它并在需要时隐藏/显示它。

    下面的说明假定您只需要在UINavigationController层次结构的一个控制器中隐藏细线。

  • 声明实例变量:

    private var shadowImageView: UIImageView?
    
  • 添加找到这个阴影的方法(细线) 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
    }
    
  • 添加/编辑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的最初创意!


    如果您只想使用实心导航栏颜色并在故事板中进行设置,请在您的AppDelegate类中使用此代码通过外观代理移除1像素边框:

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

    毕竟障碍,我发现这个解决方案删除导航栏的底部边界线。

    迅速:

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

    目标C:

    [self.navigationController.navigationBar setValue:@(YES) forKeyPath:@"hidesShadow"];
    
    链接地址: http://www.djcxy.com/p/81921.html

    上一篇: How to hide UINavigationBar 1px bottom line

    下一篇: NSAttributedString add text alignment