ChatGPT解决这个技术问题 Extra ChatGPT

如何在 iOS 中更改状态栏文本颜色

我的应用程序有深色背景,但在 iOS 7 中,状态栏变得透明。所以我在那里什么都看不到,只有角落里的绿色电池指示灯。如何将状态栏文本颜色更改为白色,就像在主屏幕上一样?

此链接包含有关此问题的有趣信息:doubleencore.com/2013/09/…
寻找更好的解决方案stackoverflow.com/questions/17678881/…
Xcode 似乎在不断地改变这一点,所以我建议向下滚动以查找更新的解决方案(例如,Super simple answer as of 2021)。

k
krjw

在 .plist 文件中将 UIViewControllerBasedStatusBarAppearance 设置为 YES。在 viewDidLoad 做一个 [self setNeedsStatusBarAppearanceUpdate];添加以下方法: - (UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleLightContent; }

注意:这不适用于 UINavigationController 内的控制器,请参阅 Tyson's comment below :)

Swift 3 - 这将在 UINavigationController 内工作控制器。在您的控制器中添加此代码。

// Preferred status bar style lightContent to use on dark background.
// Swift 3
override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

Swift 5 和 SwiftUI

对于 SwiftUI,创建一个名为 HostingController.swift 的新 swift 文件

import Foundation
import UIKit
import SwiftUI

class HostingController: UIHostingController<ContentView> {
    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }
}

然后更改 SceneDelegate.swift 中的以下代码行

window.rootViewController = UIHostingController(rootView: ContentView())

window.rootViewController = HostingController(rootView: ContentView())

我不需要第 2 步。
似乎不适用于带有 Xcode5-DP5 的 iOS 7 Beta 5。 preferredStatusBarStyle 似乎没有被调用。
UIViewControllerBasedStatusBarAppearance 更改为在 Xcode 5 GM 种子中查看基于控制器的状态栏外观
得到了 Xcode GM Seed 的答案: 1. 在 Info.plist 中,将 View controller-based status bar appearance 设置为 NO 2. 在 appDelegate 中,在 appDidFinishLaunching 方法中,输入 [[UIView appearance] setTintColor:[UIColor whiteColor]];
UINavigationController 是特例,上面的行不通。只是花了几个小时在这个问题上摸不着头脑。请参阅此处获取解决方案:stackoverflow.com/a/19513714/505457
s
squarefrog

或者,您可以选择退出基于视图控制器的状态栏外观:

在 Info.plist 中将基于视图控制器的状态栏外观设置为 NO。调用 [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

注意:此方法在 iOS9 中已被弃用。改为在 UIViewController 上使用 preferredStatusBarStyle。 (见Apple Developer Library


这是一条更好更容易的路线。
无需编码。这一切都可以从 plist 完成:(1)将“基于视图控制器的状态栏外观”设置为 NO,(2)将“状态栏样式”设置为“不透明黑色样式”。 (原始值为 UIViewControllerBasedStatusBarAppearance -> NO 和 UIStatusBarStyle -> UIStatusBarStyleBlackOpaque)
请注意,您必须将相关的 info.plist 值设置为 NO 才能正常工作。
@gothicdev:不错的收获。会接受你的答案,因为它是最干净的。条形样式的灯光选项可以是:UIStatusBarStyleLightContent
此方法已在 iOS 9 中弃用。
L
Lucas

您无需编写任何代码即可做到这一点!执行以下操作以使整个应用程序的状态栏文本颜色为白色

在您的项目 plist 文件中:

状态栏样式:透明黑色样式(alpha of 0.5)

查看基于控制器的状态栏外观:否

状态栏最初是隐藏的:否


我不知道事情是否发生了变化,但是 XCode 无法识别 UIStatusBarStyleLightContent 值,并且在任何文档中都找不到......虽然它似乎有效。
这一个也在启动屏幕上改变了它,而只是在导航器上设置它不会......荣誉!
绝对是完成此操作的最简单方法,并且如上所述也适用于启动画面。
plist info 中没有任何名为 UIStatusBarStyleLightContent 的东西,但是有 Transparent Black 可以做同样的事情 :) 另外,您需要添加 View controller-based status bar appearance,因为它最初不存在,这就是您需要得到的全部它工作:)
对于像我这样的懒惰的人,复制并过去吧:<key>UIStatusBarStyle</key> <string>UIStatusBarStyleLightContent</string> <key>UIViewControllerBasedStatusBarAppearance</key> <false/>
P
Pranav Kasetti

注意:最受好评的答案不适用于 iOS 7 / 8

在 Info.plist 中将“查看基于控制器的状态栏外观”设置为 NO

在 AppDelegate 添加

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
   ...
}    

此解决方案适用于 iOS 7 / 8。


在 iOS 9 中已弃用。:-/
M
Mark Amery

对我来说,使用其他答案(以及其他来源/文档)中的所有东西都没有发生任何事情。有帮助的是在 XIB 中将导航栏样式设置为“黑色”。这将文本更改为白色,根本没有任何代码。

https://i.stack.imgur.com/NfOK6.png


在设备中,上面的答案都没有对我有用,但这个答案。我认为它告诉了有关新系统的所有信息,您必须将 navigation_bar 设置为 BLACK 才能使 status_bar 文本为 WHITE。
在经历了很多事情之后,这就是最终的工作。样式设置为默认值。改变了这一点并去除了所有其他状态栏黑客,它可以工作。
如果您不想在 IB 中设置所有导航栏,您也可以设置其外观代理。 [[UINavigationBar 外观] setBarStyle:UIBarStyleBlack];
在 iOS7 Storyboard 中对我不起作用。看起来这可能是其他东西的副作用吗?
我想确认一下,以上所有答案都对我不起作用。在图像之后,状态栏文本看起来是白色的。但我再重复一遍,上述 Xcode 6.2 和 iOS 8.2 的 ANSWERS 不起作用。
P
Peter Mortensen

这些都不适合我,所以这是一个可行的解决方案......

Info.plist 中,添加一行:

UIViewControllerBasedStatusBarAppearance,并设置值 NO

然后在 didFinishLaunchingWithOptions 的 AppDelegate 中,添加以下行:

[application setStatusBarHidden:NO];
[application setStatusBarStyle:UIStatusBarStyleLightContent];

这个解决方案对我有用,而上面的那些没有。
太棒了,但是这个 UIViewControllerBasedStatusBarAppearance 转换为相同的:自动查看基于控制器的状态栏外观 :)
A
Ajinkya Patil

你不需要为此做任何代码

https://i.stack.imgur.com/wmTmN.png

& 将其值类型设置为 Boolean & 值设置为 NO。然后单击项目设置,然后单击常规选项卡并在部署信息下将首选状态栏样式设置为.Light,如下所示:

https://i.stack.imgur.com/9FLkn.png

而已。


我喜欢你的方法!就我而言,我试图弄清楚如何使状态栏样式仅在全屏时才变亮(没有导航栏)。然后,我意识到所有其他屏幕都应该适合相同的灯光样式。所以一个好的解决方案是为整个事情设置。谢谢! (:
如果您在应用程序运行时不需要更改此设置。这是最好的方法。
这种方法确实有效,但它在 iPad 上引入了一个奇怪的问题。如果您的应用程序支持深度链接,并且当您通过深度链接启动应用程序时,状态栏上出现的反向链接就会消失。
最好和最简单的一个。
对我来说最好的解决方案:D
I
Irfan

只需以下两步:

步骤1:

project target 的信息选项卡下,添加行:

UIViewControllerBasedStatusBarAppearance,设置值 NO

第2步:

在项目 AppDelegate.m 中:

- (BOOL)application:(UIApplication *)application 
        didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
    …
    [application setStatusBarStyle:UIStatusBarStyleLightContent];
    …
}

我喜欢这个答案,因为这是我第一次使用“应用程序”参数))
点符号,这将是完美的;)
D
Deniss Fedotovs

这适用于 2013 年 9 月 18 日发布的 Golden Master iOS 7 和 Xcode 5 GM 种子和 iOS7 SDK(至少隐藏导航控制器):

在 Info.plist 中将 UIViewControllerBasedStatusBarAppearance 设置为 NO。在 ViewDidLoad 方法或任何地方,你想在哪里更改状态栏样式: [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];


UIViewControllerBasedStatusBarAppearance 默认值似乎是 YES。 “应用程序默认使用新的基于视图控制器的状态栏管理系统。要选择退出,请将 UIViewControllerBasedStatusBarAppearance 键的值添加为 NO 到 Info.plist。” [bgr.com/2013/09/10/ios-7-gm-change-log-release-notes/]
是的!!将 UIViewControllerBasedStatusBarAppearance 设置为 NO 后,状态栏隐藏在视图中。
它应该应用于所有viewdidload吗?
您可以在 appDelegates didFinishLoading 方法中添加它。或者在第一个视图 viewDidLoad 方法中,如果您不想更改它。
太棒了,这个完成了工作。简单而伟大的编码。
M
Mohit Padalia

如果您的 UIViewController 在 UINavigationController 中,您将必须设置 BarStyle:

-[UINavigationBar setBarStyle:UIBarStyleBlack]

原始答案在这里

https://devforums.apple.com/message/844264#844264


不,这只是使导航栏颜色与状态栏文本颜色相同。这隐藏了问题,而不是解决它!
在 iOS7 中,如果视图包含 UINavigationController,状态栏将模仿 UINavigationBar,因此在许多情况下,这是正确的答案。
P
Peter Mortensen

如果您有通过 Interface Builder 创建的嵌入式导航控制器,请务必在管理您的导航控制器的类中设置以下内容:

-(UIStatusBarStyle)preferredStatusBarStyle{ 
    return UIStatusBarStyleLightContent; 
} 

这应该就是你所需要的。


这是在没有故事板和 xib 的应用程序中对我有用的唯一解决方案。对非 IB 用户也应该有帮助。
当我需要在每个视图控制器中设置不同的样式时,这对我来说是完美的
如果您想保留“查看基于控制器的状态栏外观”设置为是,这就是要走的路。谢谢!
P
Peter Mortensen

我在一个 Swift 项目中使用 Xcode 6 beta 5,用于 iOS 7 应用程序。

这是我所做的,它有效:

信息列表:

https://i.stack.imgur.com/31G46.png


谢谢,看起来只有您的解决方案适用于最新版本的 IOS7
此解决方案在加载应用程序时在启动屏幕中显示状态栏。
解决了我在 xCode 7.1 中的问题。最新版本。苹果忘记了一些重要的部分来使某些东西发挥作用。再次。
P
Pav Sidhu

转到项目-> 目标,然后将状态栏样式设置为浅色。它使启动屏幕上的状态栏变为白色。然后在 Info.plist 中将基于 View controller 的状态栏外观设置为 NO。


您将实际 View controller-based status bar appearance equal 设置为 NO 的第二部分是我缺少的部分。谢谢
完美,在我看来应该是最正确的答案。谢谢
J
James Rochabrun

https://i.stack.imgur.com/u4vyC.png

  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        UIApplication.shared.statusBarStyle = .lightContent
        return true
    }

这在 iOS9 中已被弃用,现在您应该在 rootviewcontroller 中覆盖此属性

这样做在 iOS 9 中已被弃用,应该在 rootviewcontroller 上这样做

override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
 }

真是太棒了兄弟:)谢谢。
这样做已在 iOS 9 中被弃用,应该在 rootviewcontroller 覆盖 var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }
P
Peter Mortensen

在 AppDelegate.m 中,添加以下内容。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

} 

并在 Plist 文件中,将“基于控制器的状态栏外观”设置为 NO。


p
pkamb

简单地在应用程序代理中:

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

在 Swift 5 中,请按照以下步骤操作:

在 Info.plist 中添加键 UIViewControllerBasedStatusBarAppearance 并将值设置为 false 添加键 UIStatusBarStyle 并将值设置为 UIStatusBarStyleLightContent


唯一对我有用的答案。
但是为此我们需要选择退出 View controller-based status bar appearance 。
在 iOS9 中已弃用
P
Peter Mortensen

嗯,这对我来说真的很像小菜一碟。

转到您应用的 info.plist

将基于视图控制器的状态栏外观设置为 NO 将状态栏样式设置为 UIStatusBarStyleLightContent

然后转到您的应用程序的委托并粘贴以下代码,您可以在其中设置 Windows 的 RootViewController。

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
{
    UIView *view=[[UIView alloc] initWithFrame:CGRectMake(0, 0,320, 20)];
    view.backgroundColor=[UIColor colorWithRed:0/255.0 green:0/255.0 blue:0/255.0 alpha:1.0];
    [self.window.rootViewController.view addSubview:view];
}

答对了。它对我有用。


我认为这是正确的答案(plist 的一部分)...为什么我要在 didfinishlaunchingwithoptions 上添加静态代码...如果您需要整个应用程序使用相同的颜色,这是正确的方法
J
Josh Earl

iOS 7 允许各个视图控制器确定状态栏的外观,如 Apple 开发人员文档所述:

iOS 7 让视图控制器能够在应用程序运行时调整状态栏的样式。动态更改状态栏样式的一个好方法是实现preferredStatusBarStyle,并在动画块内更新状态栏外观并调用setNeedsStatusBarAppearanceUpdate。

全局设置状态栏外观是一个两步过程。

首先,您需要告诉 iOS 您不想在逐个视图的基础上设置状态栏外观。

然后你需要负责并实际设置新的全局状态栏样式。

要禁用逐视图状态栏控制,您需要在 Info.plist 中设置 View controller-based status bar appearance 属性。

打开 Project Navigator 并为您的 iOS 应用程序选择项目,然后选择 Info 选项卡。

将鼠标悬停在一行上,然后点击出现的加号以将新属性添加到您的 .plist

在 Key 字段中输入 View controller-based status bar appearance,然后确保 Type 字段设置为 Boolean。最后,在值字段中输入 NO

要为状态栏设置全局样式,请在信息选项卡下添加另一个属性,键为 Status bar style,类型为 String,值为 Opaque black style

这是一篇博客文章,其中包含更多细节和一些示例代码:

http://codebleep.com/setting-the-status-bar-text-color-in-ios-7/


谢谢。我的问题是我没有看到“基于视图控制器的状态栏外观”的类型设置为字符串。 “手动”编辑 .plist 文件并输入布尔值清除了一切。
P
Peter Mortensen

为 Xcode GM Seed 更新的答案:

在 Info.plist 中将基于 View controller 的状态栏外观设置为 NO 在项目中,设置: In ViewDidLoad: [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];


这改变了标签栏,而不是我的状态栏。
p
pkamb

Xcode 似乎不断地改变这一点,所以这是最新的。

截至 2021 年 - Swift 5、Xcode 12

要将状态栏更改为白色:

打开你的 Info.plist。添加键 UIViewControllerBasedStatusBarAppearance 并将值设置为 No (false)。人类可读的版本是“基于视图控制器的状态栏外观”。添加键 UIStatusBarStyle 并将值设置为 UIStatusBarStyleLightContent(即“Light Content”)。


这对我有用,也是最容易理解的。
M
Mohit Tomar

不需要做一些额外的事情,只需在你的 viewController 中编写这段代码并获得状态栏颜色为白色

- (UIStatusBarStyle)preferredStatusBarStyle{return UIStatusBarStyleLightContent;}

实现后将其放在 ViewController.m 下。它最简单,效果很好!谢谢你莫希特!
F
Fawkes

我认为所有答案都没有真正指出问题所在,因为它们都适用于特定场景。但是,如果您需要涵盖所有情况,请遵循以下几点:

根据您需要状态栏灯样式的位置,您应该始终牢记以下 3 点:

https://i.stack.imgur.com/lZtBI.png

2)如果您在导航控制器中有一个控制器您可以在界面构建器中更改它,如下所示:

https://i.stack.imgur.com/5kKP5.png

b)然后将导航栏的样式设置为“黑色”,因为这意味着您的状态栏下会有一个“黑色” -> 深色背景,所以它将状态栏设置为白色

https://i.stack.imgur.com/Dp7xF.png

或者在代码中执行如下

navigationController?.navigationBar.barStyle = UIBarStyle.Black

3)如果您只有控制器需要拥有自己的状态栏样式,并且它没有作为 UINavigationController 嵌入到某些容器结构中

在代码中为控制器设置状态栏样式:

https://i.stack.imgur.com/no246.png


请解释你的情况,我会尽力帮助
我必须将 StatusBarIsIntiallyHidden = NO 添加到 plist 以及 ViewControllerBasedApplicationStatusBarAppearnce = NO 到 plist。然后这使用第一部分
您是否有与第一个加载视图控制器具有相同“图像”的启动画面?此外,在目标的“信息”部分,您可以尝试将“隐藏状态栏”设置为 false 并避免处理您的 .plist。 “StatusBarIsIntiallyHidden”标志
我不。它使用生成的默认 xib。
实际上,我在 xCode 7.1 中创建新项目时发现了这个问题,这就是为什么我认为它很奇怪
K
Krunal

以下是关于状态栏更改的Apple Guidelines/Instruction。只有黑暗与状态栏中允许使用亮光(而 & 黑色)。

这是 - 如何更改状态栏样式:

如果要设置状态栏样式、应用程序级别,则在“.plist”文件中将 UIViewControllerBasedStatusBarAppearance 设置为 NO

如果您想在视图控制器级别设置状态栏样式,请按照以下步骤操作:

如果您只需要在 UIViewController 级别设置状态栏样式,请在 .plist 文件中将 UIViewControllerBasedStatusBarAppearance 设置为 YES。在 viewDidLoad 添加函数 - setNeedsStatusBarAppearanceUpdate 覆盖视图控制器中的 preferredStatusBarStyle。

-

override func viewDidLoad() {
    super.viewDidLoad()
    self.setNeedsStatusBarAppearanceUpdate()
}

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

https://i.stack.imgur.com/8sH5i.png

这是在应用程序启动期间或视图控制器的 viewDidLoad 期间更改/设置状态栏背景颜色的一些技巧。

extension UIApplication {

    var statusBarView: UIView? {
        return value(forKey: "statusBar") as? UIView
    }

}

// Set upon application launch, if you've application based status bar
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        UIApplication.shared.statusBarView?.backgroundColor = UIColor.red
        return true
    }
}


or 
// Set it from your view controller if you've view controller based statusbar
class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        UIApplication.shared.statusBarView?.backgroundColor = UIColor.red
    }

}

这是结果:

https://i.stack.imgur.com/LKppl.png


C
Cagdas Altinkaya

只需调用

[[UINavigationBar appearance] setBarStyle:UIBarStyleBlack];

在里面

-(BOOL)application:(UIApplication *)application 
           didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
}

我的 AppDelegate 方法在 iOS7 中非常适合我。


哇,这里有很多废话,但这个答案对我有用。我正在使用 Xcode 6 和 iOS 8 SDK
非常好,在带有 View controller-based status bar appearance = NO 的 iOS 9 中为我工作
w
wrtsprt

这在 iOS 7 UI Transition Guide 中有记录,您需要 Apple 开发者 ID 才能直接访问。相关摘录:

因为状态栏是透明的,所以它后面的视图就透出来了。 [...] 使用 UIStatusBarStyle 常量来指定状态栏内容是深色还是浅色:UIStatusBarStyleDefault 显示深色内容。 [...] UIStatusBarStyleLightContent 显示浅色内容。当深色内容位于状态栏后面时使用。

也可能感兴趣:

在 iOS 7 中,您可以从单个 vew 控制器控制状态栏的样式,并在应用程序运行时更改它。要选择启用此行为,请将 UIViewControllerBasedStatusBarAppearance 键添加到应用程序的 Info.plist 文件中,并将其设置为 YES。

我绝对建议您查看文档,再次,您可以使用您的 Apple 开发人员 ID 访问该文档。


我已经尝试过 [应用程序 setStatusBarStyle:UIStatusBarStyleLightContent];但实际上没有任何变化,文字颜色仍然是黑色
我很乐意提供更多帮助,但就像我说的,我对 iOS 开发过程不够熟悉,不知道该建议什么。对不起!
1) 在 plist 中将 UIViewControllerBasedStatusBarAppearance 设置为 YES 2) 在 viewDidLoad 中执行 [self setNeedsStatusBarAppearanceUpdate]; 3) 添加如下方法:-(UIStatusBarStyle)preferredStatusBarStyle{ return UIStatusBarStyleLightContent; }
s
superm0

对于 Swift 5,我添加了以下几行:

override func viewDidAppear(_ animated: Bool) {
    navigationController?.navigationBar.barStyle = .black
}

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

不过,preferredStatusBarStyle 没有做任何事情。 .black 可以进入 viewDidLoad 就好了。
C
Community

我做了一些不同的事情,它对我有用。

在没有更改代码的情况下,我确实像这样配置了我的 .plist 文件:

查看基于控制器的状态栏外观 > 否

状态栏样式 > UIStatusBarStyleLightContent(简单字符串)

我希望它有所帮助。

编辑

对于每个视图控制器,我将情节提要中的“状态栏”的模拟指标属性从“推断”更改为“轻量内容”


p
parvind

在 info.plist 中设置字段值 NO 查看基于控制器的状态栏外观并在目标 > 常规设置中设置状态栏样式灯。


获胜者获胜者鸡肉晚餐
f
fraxool

如果你想用 Swift 得到同样的结果,你可以在你的 AppDelegate.swift 文件中使用这个代码:

UINavigationBar.appearance().barStyle = .BlackTranslucent

并且您的状态栏的文本将是白色的 :-) !


b
budiDino

总结一下,编辑您的项目 Info.plist 并添加:

View controller-based status bar appearanceNO

Status bar styleOpaque black style

或者如果您有原始键/值 plist

UIViewControllerBasedStatusBarAppearanceNO

UIStatusBarStyleOpaque black style


这对我有用,而且比使用 preferredStatusBarStyle 麻烦少,因为您可以全局配置它(当然,这只对您的情况有用)