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 中设置透明导航栏和状态栏的图像底图