iOS Swift 修改状态栏的风格。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS Swift 修改状态栏的风格。相关的知识,希望对你有一定的参考价值。

参考技术A 最近在学习Swift的时候,重新梳理了一遍修改状态栏的知识点

     1. 以UIAPPlication为准 设置 UIApplication.shared.statusBarStyle 的值来确定状态栏的风格,UIApplication.shared.statusBarStyle 为枚举:.default .lightContent(iOS 7.0) .darkContent(iOS 13.0) 前提是在plist.info文件中设置View controller-based status bar appearance 的值为false

    2. 以控制器中重写父类的preferredStatusBarStyle属性的get方法为准 来设置状态栏的风格,返回值为 UIStatusBarStyle类型的枚举,枚举值分别是: .default  .lightContent(iOS 7.0) .darkContent(iOS 13.0) , 前提是在plist.info文件中设置 View controller-based status bar appearance 的值为true

以上dackContent的值为iOS13 暗黑风格新添加的属性. 如果不需要适配暗黑属性,可在info文件中设置 User Interface Style 的值为 Light

第一种方法 可以直接设置设置UIApplication.shared.statusBarStyle即可。

第二种方法,在父类变量preferredStatusBarStyle的get方法中 返回一个控制状态栏的变量,在需要改变风格的时候 改变控制状态栏变量的值,然后调用setNeedsStatusBarAppearanceUpdate()方法,这个方法调用之后 系统会自动再去读取preferredStatusBarStyle变量返回的值,即可设置状态栏的风格。

    此时要注意,需要重写NavigationController的childForStatusBarStyle和childForStatusBarHidden方法,才能够在viewController中设置生效:

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

【中文标题】在 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

【讨论】:

以上是关于iOS Swift 修改状态栏的风格。的主要内容,如果未能解决你的问题,请参考以下文章

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

使用 Xcode 和 Swift 创建的 iOS 应用程序中状态栏的自定义背景颜色

李洪强iOS开发之-修改状态栏的字体的颜色

Android实现修改状态栏背景字体和图标颜色的方法

Android实现修改状态栏背景字体和图标颜色的方法

Swift:更改 iOS 13 的状态栏颜色