在 Swift iOS 8 中设置透明导航栏和状态栏的图像底图

Posted

技术标签:

【中文标题】在 Swift iOS 8 中设置透明导航栏和状态栏的图像底图【英文标题】:Set Image Underlay of Transparent Navigation Bar and Status Bar in Swift iOS 8 【发布时间】:2015-07-14 06:23:50 【问题描述】:

我是 ios swift 开发的新手,我遇到了一个问题。我想设置透明导航栏,并制作透明导航栏和状态栏的图像底层,如下图所示,

但是在我实现了下面的代码之后,

self.navigationController!.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .Default)
self.navigationController!.navigationBar.shadowImage = UIImage()
self.navigationController!.navigationBar.translucent = true

即使我将导航栏设置为透明,结果仍然是导航栏和状态栏下方的图像。

【问题讨论】:

Make UINavigationBar transparent 的可能重复项 【参考方案1】:

如果您没有使用默认导航栏,则将背景图像视图(将在状态栏下方可见)从顶部约束向上移动 20 像素,然后使用以下命令清除状态栏背景颜色:

 override func viewDidLoad() 
    super.viewDidLoad()

    let statusBar = UIApplication.shared.value(forKeyPath: "statusBarWindow.statusBar") as? UIView
        statusBar?.backgroundColor = UIColor.clear

如果要将状态栏项的颜色更改为白色,请使用:

 override var preferredStatusBarStyle: UIStatusBarStyle 
    return .lightContent

输出将是

【讨论】:

我正在使用带有静态单元格的 tableview 控制器。并且图像视图位于第 0 个标题单元格中,覆盖 statusBarStyle 使其半透明,但不知何故,图像从状态栏下方开始,我还将上边距更新为 -20。知道为什么会这样吗? @UsamabinAttique 如果你必须将上边距设置为 -20 你做错了什么。由于系统栏大约有 20 个点的高度。您可能连接到安全区域或系统栏而不是超级视图【参考方案2】:

我已经尝试了与您提供的相同的代码:

override func viewDidLoad() 
    super.viewDidLoad()
    self.navigationController!.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .Default)
    self.navigationController!.navigationBar.shadowImage = UIImage()
    self.navigationController!.navigationBar.translucent = true

它工作正常,你可以在这里看到结果:

检查我的sample 项目,看看你缺少什么。

希望它会有所帮助。

【讨论】:

1) 顶部约束必须是superview,而不是safe area。 2)如果你有tableV并使用ios11添加tableV.contentInsetAdjustmentBehavior = .never【参考方案3】:

我通过为状态栏背景设置透明 UIColor 解决了这个问题。

    guard  let statusBar = UIApplication.sharedApplication().valueForKey("statusBarWindow")?.valueForKey("statusBar") as? UIView else 
                return
            
            statusBar.backgroundColor = UIColor(red: 2, green: 200.0, blue: 200, alpha: 0) // color value has no effect. Only alpha value is needed to make it transparent

【讨论】:

Swift 5.1 iOS 13 守卫让 statusBar = (UIApplication.shared.value(forKey: "statusBarWindow")? as AnyObject).value("statusBar") as? UIView else return 无法使用类型为“(字符串)”的参数列表调用“值”【参考方案4】:

根据 Dharmesh 的回答,但已针对 Swift 4 进行了更新

    self.navigationController!.navigationBar.setBackgroundImage(UIImage(), for: .default)
    self.navigationController!.navigationBar.shadowImage = UIImage()
    self.navigationController!.navigationBar.isTranslucent = true

【讨论】:

以上是关于在 Swift iOS 8 中设置透明导航栏和状态栏的图像底图的主要内容,如果未能解决你的问题,请参考以下文章

如何在 IB 中设置导航栏和工具栏背景图像

iOS 8 -- 对导航栏和状态栏应用模糊

使用 react-native 在 iOS 中设置半透明状态栏

在 ios 7 中制作透明导航栏和透明标签栏。

iOS 8 启动图像文件 - 导航栏和状态栏

Android 沉浸式/透明式状态栏、导航栏