我的应用程序具有登录前屏幕的default
状态栏样式。
-登录后,应用在整个应用中的状态栏使用lightContent
样式。
在iOS 12之前一切正常。开始在iOS 13 上创建问题(仅当启用了暗模式时)。
有些东西我已经尝试过了,但仍然无法正常工作。
UIUserInterfaceStyle
设置为Light
UIViewControllerBasedStatusBarAppearance
设置为YES
override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }
viewDidLoad()
中。 setNeedsStatusBarAppearanceUpdate()
但是,我仍然没有摆脱与状态栏相关的问题。在登录之前,我只需要状态栏在屏幕上变黑即可,一旦用户登录,状态栏应亮起。
对于黑暗和明亮模式,整个应用程序应具有相同的UI。 (适用于iOS 13以下的操作系统)目前可以正常运行,但只有状态栏会更改颜色。
注意:禁用暗模式时,一切工作正常。仅当启用黑暗模式时,这才会产生问题。
据我了解,我在Xcode中创建了一个新项目,并添加了3个具有不同状态栏外观的屏幕。
工作案例
VC1-Default
样式
VC2-Default
样式
VC3-LightContent
样式
工作案例
VC1-LightContent
样式
VC2-LightContent
样式
VC3-Default
样式
不起作用(失败)案例
VC1-Default
样式
VC2-LightContent
样式
VC3-Default
样式
我想的是-如果您在应用程序中使用任何一种样式,则无论设备的暗模式还是亮模式,它都可以正常工作。但是,如果将Default
和LightContent
都结合使用以在应用程序中显示状态栏,则在启用黑暗模式时,它无法按预期工作。
有人可以通过状态栏样式的这种行为帮助我吗?
这是我的三个视图控制器文件。它只是将一个控制器推到另一个。这是我上面提到的演示项目的文件。其中有失败案例。
当黑暗模式关闭时:,即使我在VC2中覆盖状态栏样式,我也总是得到default
状态栏样式。
黑暗模式关闭时:即使我在VC1和VC3中覆盖状态栏样式,我也总是得到lightContent
状态栏样式。
答案 0 :(得分:4)
对于您来说,导航控制器负责维护状态栏样式。因此,您需要对导航控制器进行子类化,并覆盖它的preferredStatusBarStyle。
答案 1 :(得分:1)
您可以在项目设置的常规中设置默认状态栏样式。
答案 2 :(得分:0)
如果您不想在应用程序中支持暗模式(似乎想要固定的灯光和默认配色方案),则可以通过设置设置在Info.plist中完全退出使用它
.dockerignore
可以变亮或变暗,也可以在每个单独的视图控制器上UIUserInterfaceStyle
要只更改状态栏外观而不使用darkMode进行任何操作,您可以选择退出Info.plist中的黑暗模式,然后添加值为{YES的override var overrideUserInterfaceStyle: UIUserInterfaceStyle { get { .light }
set { //you can leave this empty } }
,并且在每个viewController中您需要不同的状态栏样式,您需要覆盖首选样式状态栏外观属性如下:
UIUserInterfaceStyle
最后,您在viewDidLoad()中调用 override var preferredStatusBarStyle: UIStatusBarStyle {
.lightContent
}
}
如果在导航控制器中,则需要在自定义的navi控制器类中设置以上内容:
setNeedsStatusBarAppearanceUpdate()
然后在每个VC中,您都可以在viewDid上设置Appear属性:
import UIKit
class Navi: UINavigationController {
public var requiredStatusBarStyle: UIStatusBarStyle = .lightContent {
didSet {
setNeedsStatusBarAppearanceUpdate()
}
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
override var preferredStatusBarStyle: UIStatusBarStyle {
requiredStatusBarStyle
}
}
如果您不想在明暗之间剧烈跳动,可以将uiview动画包裹在setneedsstatusbarupdate上
if let navi = navigationController as? Navi {
navi.requiredStatusBarStyle = .darkContent
}
答案 3 :(得分:0)
请尝试使用一次
controller.navigationController?.navigationBar.isTranslucent = false
因为在我看来,它是可行的。