ios - 如何隐藏 UINavigationBar 1px 底线

我有一个应用有时需要其导航栏才能与内容融为一体。

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

在下图的情况下,我说的是“ Root View Controller ”下方的 1px 高度线

最佳答案

对于 iOS 13:

使用 .shadowColor属性

If this property is nil or contains the clear color, the bar displays no shadow

例如:

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

适用于 iOS 12 及以下版本:

为此,您应该设置自定义阴影图像。但是要显示阴影图像,您还需要设置自定义背景图像,引用 Apple 的文档:

For a custom shadow image to be shown, a custom background image must also be set with the setBackgroundImage(_:for:) method. If the default background image is used, then the default shadow image will be used regardless of the value of this property.

所以:

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,但效果很好。我们试图移除的阴影是 UINavigationBar 下某处的细线 UIImageView。我们可以找到它并在需要时隐藏/显示它。

以下说明假设您只需要在 UINavigationController 层次结构的一个 Controller 中隐藏细线。

  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 的原创创意!

https://stackoverflow.com/questions/19226965/

相关文章:

ios - 使用 iOS 确定设备(iPhone、iPod Touch)

objective-c - 比较浮点值有多危险?

objective-c - Objective-C 中的#import 和#include 有什么区

objective-c - 关闭键盘的简单方法?

objective-c - 如何按字母顺序对 NSArray 进行排序?

ios - 文件是通用的(三个切片),但它不包含 iOS 上静态库的(n)ARMv7-s 切片错误,

ios - 应用程序在应用程序启动结束时应该有一个 Root View Controller

iphone - 如何使用返回键关闭 UITextView 的键盘?

objective-c - 将 block 内的变量分配给 block 外的变量

objective-c - 如何将 NSMutableArray 转换为 NSArray?