swift 隐藏状态栏_Swift - 动态改变状态栏statusBar文字颜色(preferredStatusBarStyle无效问题)...

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-23 06:34   127   0

默认情况下,顶部状态栏(statusBar)为 default样式(文字为黑色),我们可以将其改为 light样式(文字为白色),具体方法可以看我之前写的文章(点击查看)

但之前我们都是在应用发布前就决定好样式。如果我们想要在程序运行中,能动态地改变状态栏样式也是可以做到的。这个根据是否有导航栏,分别有不同实现方式。

1,没有导航栏的情况

(1)如果没有使用导航控制器 UINavigationController, 或者说它的 navigationBar被隐藏的话,那么我们需要重写 preferredStatusBarStyle方法(在里面返回希望使用的样式),然后在需要更新的时候调用 setNeedsStatusBarAppearanceUpdate()方法来触发它。

(2)下面是一个简单的样例,每次点击按钮,导航栏文字颜色会在白色和黑色之前切换。

8b7b0da655744c5660f683190a2b98d2.png

35ef30dd4b864a1031a2a993f7534370.png

import UIKit

class ViewController: UIViewController {

// 当前statusBar使用的样式

var style: UIStatusBarStyle = .default

// 重现statusBar相关方法

override var preferredStatusBarStyle: UIStatusBarStyle {

return self.style

}

override func viewDidLoad() {

super.viewDidLoad()

}

// 每次点击按钮切换一次样式

@IBAction func changeStyle(_ sender: Any) {

if self.style == .lightContent {

self.style = .default

} else {

self.style = .lightContent

}

setNeedsStatusBarAppearanceUpdate()

}

}

2,有导航栏的情况

如果我们使用了导航控制器 UINavigationController, 且它的 navigationBar没有被隐藏,那么会发现即使重写 preferredStatusBarStyle方法,这个方法也不会被调用。因为此时状态栏的样式是根据导航栏的样式来自动变换的。

(1)下面样例当显示默认导航栏时,状态栏文字为黑色。当导航栏隐藏时,将状态栏文字设为白色。

94a750e3756414e0684d998906bbef76.png

3a9e009d6a4199970f7fca845c48be56.png

import UIKit

class ViewController: UIViewController {

// 当前statusBar使用的样式

var style: UIStatusBarStyle = .default

// 重现statusBar相关方法

override var preferredStatusBarStyle: UIStatusBarStyle {

return self.style

}

override func viewDidLoad() {

super.viewDidLoad()

}

// 每次点击按钮切换一次样式

@IBAction func changeStyle(_ sender: Any) {

if let isHidden = self.navigationController?.isNavigationBarHidden {

// 切换导航栏显示或者隐藏

self.navigationController?.isNavigationBarHidden = !isHidden

// 更新状态栏颜色

self.style = !isHidden ? .lightContent : .default

setNeedsStatusBarAppearanceUpdate()

}

}

}

(2)下面样例在切换导航栏样式时,状态栏文字样式也会自动随之变换。当然我们也不需要重写 preferredStatusBarStyle方法

ba573026dd9e2af5539315f35e9c5a29.png

661c917cd709a4211db1ab7016563cc8.png

import UIKit

class ViewController: UIViewController {

override func viewDidLoad() {

super.viewDidLoad()

}

// 每次点击按钮切换一次样式

@IBAction func changeStyle(_ sender: Any) {

if let navigationBar = self.navigationController?.navigationBar {

// 切换导航栏样式

if navigationBar.barStyle == .default {

navigationBar.barStyle = .black

} else {

navigationBar.barStyle = .default

}

}

}

}

(3)即使我们修改了导航栏的背景色或者背景片,只要导航栏样式变化了,状态栏也会随之变化。

d92e392c3accf2cd92657b3d5f418b37.png

936b526a44b59229bcd05e0a78dda345.png

import UIKit

class ViewController: UIViewController {

override func viewDidLoad() {

super.viewDidLoad()

// 将导航栏背景色设置橙色

self.navigationController?.navigationBar.barTintColor = UIColor.orange

}

// 每次点击按钮切换一次样式

@IBAction func changeStyle(_ sender: Any) {

if let navigationBar = self.navigationController?.navigationBar {

// 切换导航栏样式

if navigationBar.barStyle == .default {

navigationBar.barStyle = .black

} else {

navigationBar.barStyle = .default

}

}

}

}

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP