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

时间:2013-07-16 14:11:22

标签: ios ios7 statusbar textcolor uistatusbar

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

57 个答案:

答案 0 :(得分:1334)

  1. 在.plist文件中将UIViewControllerBasedStatusBarAppearance设置为YES

  2. viewDidLoad执行[self setNeedsStatusBarAppearanceUpdate];

  3. 添加以下方法:

    - (UIStatusBarStyle)preferredStatusBarStyle
    { 
        return UIStatusBarStyleLightContent; 
    }
    
  4. 注意:这不适用于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
    }
    

答案 1 :(得分:843)

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

  1. View controller-based status bar appearance。{/ li>中将NO设为Info.plist
  2. 致电[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
  3. 注意:此方法已在iOS9中弃用。请改用UIViewController上的preferredStatusBarStyle。 (见Apple Developer Library

答案 2 :(得分:433)

您无需编写任何代码即可完成此操作!
执行以下操作以使状态栏文本颜色在整个应用程序中变为白色

项目plist 文件:

  • 状态栏样式:Transparent black style (alpha of 0.5)
  • 查看基于控制器的状态栏外观:NO
  • 状态栏最初是隐藏的:NO

答案 3 :(得分:241)

注意:大多数赞成的答案不适用于iOS 7/8

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

在AppDelegate中添加

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

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

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

答案 4 :(得分:110)

对我而言,在其他答案(以及其他来源/文档)中使用所有内容时没有任何反应。有什么帮助是在XIB中将导航栏样式设置为“黑色”。这将文本更改为白色而没有任何代码。

Enter image description here

答案 5 :(得分:96)

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

Info.plist中,添加一行:

UIViewControllerBasedStatusBarAppearance,并设置值NO

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

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

答案 6 :(得分:60)

您不需要为此

执行任何代码

您需要添加"查看基于控制器的状态栏外观"在info.plist中键入如下:enter image description here

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

enter image description here

多数民众赞成。

答案 7 :(得分:48)

以下两个步骤:

第1步:

project target的信息标签下,添加行:

UIViewControllerBasedStatusBarAppearance,设置值NO

第2步:

在项目AppDelegate.m中:

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

答案 8 :(得分:43)

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

  1. the UIViewControllerBasedStatusBarAppearance设置为NO Info.plist

  2. ViewDidLoad方法或任何地方,您想要更改哪里 状态栏样式: [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

答案 9 :(得分:32)

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

-[UINavigationBar setBarStyle:UIBarStyleBlack]

原始答案在这里

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

答案 10 :(得分:29)

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

-(UIStatusBarStyle)preferredStatusBarStyle{ 
    return UIStatusBarStyleLightContent; 
} 

这应该是你所需要的一切。

答案 11 :(得分:27)

我在Xcode项目中使用Swift 6 beta 5,适用于iOS 7应用。

这是我做的,它的确有效:

info.plist中:

Enter image description here

答案 12 :(得分:22)

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

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

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

} 

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

答案 13 :(得分:20)

嗯,这对我来说真的像蛋糕一样。

转到您应用的info.plist

  1. View controller-based status bar appearance设为NO
  2. Status bar style设为UIStatusBarStyleLightContent
  3. 然后转到您应用的代理并粘贴以下代码,您可以在其中设置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];
    }
    

    宾果。它对我有用。

答案 14 :(得分:20)

  1. 转到Project - > Target

  2. 然后将Status Bar Style设为Light。它使状态栏从启动屏幕变为白色。 Project Setting

  3. 然后将View controller-based status bar appearance设置为NO中的Info.plist

答案 15 :(得分:20)

仅限于Appdelegate

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

答案 16 :(得分:17)

Change in info PLIST 在Swift 3中只需2步即可轻松实现。 转到info.plist并将密钥View controller-based status bar appearance更改为"否"。 然后在Appdelegate中,在didfinishlaunchingwithoptions方法中添加这一行

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

现在你应该在rootviewcontroller中覆盖这个属性

,这已经在iOS9中被弃用了

在iOS 9中不推荐这样做应该在rootviewcontroller上执行此操作

override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
 }

答案 17 :(得分:17)

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

  

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

全局设置状态栏外观分为两步。

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

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

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

打开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/

答案 18 :(得分:12)

无需额外做一些,只需在viewController中编写此代码并获取状态栏颜色为白色

- (UIStatusBarStyle)preferredStatusBarStyle{return UIStatusBarStyleLightContent;}

答案 19 :(得分:12)

为Xcode GM Seed更新了答案:

  1. Info.plistView controller-based status bar appearance作为NO

  2. 在项目中,设置:

    Enter image description here

  3. 在ViewDidLoad中:

    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

答案 20 :(得分:11)

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

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

1)如果您需要启动屏幕或其他地方的状态栏,您无法控制它(不在视图控制器中,而是一些系统控制的元素/时刻,如启动屏幕) 您转到项目设置 Project settings

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

a)选择导航控制器的导航栏 Select the navigation bar of your navigation controller

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

enter image description here

或者在代码中执行以下操作

navigationController?.navigationBar.barStyle = UIBarStyle.Black

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

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

Setting the status bar style in code

答案 21 :(得分:10)

只需致电

[[UINavigationBar appearance] setBarStyle:UIBarStyleBlack];

中的

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

我的AppDelegate方法在iOS7中对我很有用。

答案 22 :(得分:9)

iOS 7 UI Transition Guide中记录了这一点,您需要Apple开发人员ID才能直接访问。相关摘录:

  

因为状态栏是透明的,所以它后面的视图显示出来。 [...]使用UIStatusBarStyle常量来指定状态栏内容是暗还是亮:

     

UIStatusBarStyleDefault显示黑暗内容。 [...]

     

UIStatusBarStyleLightContent显示内容较少。当暗内容位于状态栏后面时使用。

也可能感兴趣:

  

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

我绝对建议您浏览一下该文档,您也可以使用Apple开发者ID访问该文档。

答案 23 :(得分:8)

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

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

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

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

  1. 如果您只需要在UIViewController级别设置状态栏样式,请在UIViewControllerBasedStatusBarAppearance文件中将YES设置为.plist
  2. 在viewDidLoad添加功能 - setNeedsStatusBarAppearanceUpdate

  3. 覆盖视图控制器中的preferredStatusBarStyle。

  4. -

    override func viewDidLoad() {
        super.viewDidLoad()
        self.setNeedsStatusBarAppearanceUpdate()
    }
    
    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }
    

    根据状态栏样式设置级别设置.plist的值。 enter image description here


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

    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
        }
    
    }
    



    结果如下:

    enter image description here

答案 24 :(得分:8)

如果你想要与Swift相同的结果,你可以在你的AppDelegate.swift文件中使用这段代码:

UINavigationBar.appearance().barStyle = .BlackTranslucent

状态栏的文字为白色:-)!

答案 25 :(得分:7)

在Plist中,添加:

  • 状态栏样式:UIStatusBarStyleLightContent
  • 查看基于控制器的状态栏外观:NO

答案 26 :(得分:7)

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

如果代码没有变化,我确实配置了我的.plist文件:

  • 查看基于控制器的状态栏外观> NO
  • 状态栏样式> UIStatusBarStyleLightContent(简单字符串)

我希望它有所帮助。

修改

对于每个视图控制器,我将故事板中的“状态栏”的模拟度量属性从“推断”更改为“轻量级内容”

答案 27 :(得分:7)

如果您仍想在info.plist中将View controller-based status bar appearance设置为YES,这意味着您可以更改每个视图控制器的状态栏,请在ViewDidLoad的状态栏中使用以下白色文本:< / p>

[[[self navigationController] navigationBar] setBarStyle:UIBarStyleBlackTranslucent];

答案 28 :(得分:7)

在info.plist中设置字段值NO 查看基于控制器的状态栏外观并在目标&gt;中设置状态栏样式指示灯。一般设定。

答案 29 :(得分:7)

让我给你一个完整的答案。更改状态栏文本颜色非常容易,但在iOS 7中特别适合新手使用它会有点混乱。

如果您试图通过选择视图控制器并转到右侧的模拟指标,在Storyboard中将颜色从黑色更改为白色,那么它将无法工作,我也不知道为什么。它应该通过这样改变,但任何方式。

其次,您在plist中找不到UIViewControllerBasedStatusBarAppearance属性,但默认情况下不存在。您必须通过单击+按钮自行添加它,然后将其设置为NO。

ios 7状态栏文字颜色

最后,您必须转到AppDelegate.m文件并在didFinishLaunchingWithOptions方法中添加以下内容,添加以下行:

     [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

这会将所有视图控制器的颜色更改为白色。希望这有帮助!

答案 30 :(得分:6)

使这项工作的关键是只有全屏视图控制器才能决定状态栏的风格。

如果您正在使用导航控制器并希望在每个视图控制器的基础上控制状态栏,您将需要子类化UINavigationController并实现preferredStatusBarStyle,以便它返回topViewController的首选项。

确保将故事板场景中的类引用从UINavigationController更改为子类(例如下例中的MyNavigationController)。

(以下对我有用。如果您的应用程序是基于TabBar的,您可能希望通过继承UITabBarController来做类似的事情,但我还没有尝试过。)

@interface MyNavigationController : UINavigationController

@end

@implementation MyNavigationController

- (UIStatusBarStyle)preferredStatusBarStyle
{
    return self.topViewController.preferredStatusBarStyle;
}

@end

答案 31 :(得分:6)

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

View controller-based status bar appearanceNO

Status bar styleOpaque black style

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

UIViewControllerBasedStatusBarAppearanceNO

UIStatusBarStyleOpaque black style

答案 32 :(得分:5)

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

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

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

答案 33 :(得分:5)

对于Xcode 5.1:

在.plist中将查看基于控制器的状态栏外观添加到

在AppDelegate中,添加:

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

这就是全部!

答案 34 :(得分:4)

Xcode 似乎一直在改变这一点,所以这是最新的。

截至 2021 年 - Swift 5、Xcode 12

要将状态栏更改为白色:

  1. 打开您的Info.plist
  2. 添加键 UIViewControllerBasedStatusBarAppearance 并将值设置为 No (false)。
  3. 添加键 UIStatusBarStyle 并将值设置为 UIStatusBarStyleLightContent(即轻量内容)。

答案 35 :(得分:4)

在Info.plist中设置&#39;查看基于控制器的状态栏外观&#39;没有

在AppDelegate中添加

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

答案 36 :(得分:4)

您可以从info.plist:

执行此操作

1)“查看基于控制器的状态栏外观”设置为“否”

2)“状态栏样式”设置为“UIStatusBarStyleLightContent”

完成

答案 37 :(得分:3)

在iOS 8中: 将NavigationController.NavigationBar.BarStyle = UIBarStyle.Black;添加到viewDidLoad

答案 38 :(得分:3)

如果您的应用程序默认需要UIStatusBarStyleLightContent,但您仍希望能够在某些屏幕上使用UIStatusBarStyleDefault,则可以选择管理控制器级别的状态栏颜色,但在这种情况下,您将不得不在每个视图控制器中覆盖preferredStatusBarStyle(或在基本视图控制器中实现它,所有其他视图控制器将从该控制器继承)。这是解决这个问题的另一种方法:

  • 将plist中的UIViewControllerBasedStatusBarAppearance设置为NO
  • UIStatusBarStyle设置为UIStatusBarStyleLightContent

所有视图控制器都将使用白色文本作为状态栏。现在,仅在需要带有黑色文本的状态栏的视图控制器中添加此方法:

-(void)viewWillAppear:(BOOL)animated  
{  
  [super viewWillAppear:animated];  
  [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
}    

-(void)viewWillDisappear:(BOOL)animated  
{  
  [super viewWillAppear:animated];  
  [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
}    

答案 39 :(得分:3)

如果我使用UINavigationController

,我会在iOS 9和Swift 2.0中创建
self.navigationController?.navigationBar.barStyle = UIBarStyle.Black

如果我使用modal segue

,我会这样做
override func preferredStatusBarStyle() -> UIStatusBarStyle {
    return .LightContent
}

答案 40 :(得分:3)

从Xcode(没有任何编码)执行此操作的最简单方法是:

  • View controller-based status bar appearance添加到您的Info.plist并将值设置为NO
  • 现在,转到您的项目目标,在Deployment Info内,您将找到Status Bar Style的选项。将此选项的值设置为Light

您将拥有White状态栏。

答案 41 :(得分:3)

Swift 3 - Xcode 8。

如果您希望状态栏在启动屏幕上最初隐藏,请尝试此操作,

第1步:将以下内容添加到info.plist

  • View controller-based status bar appearanceNO
  • Status bar is initially hiddenYES

第2步:在didFinishLaunchingWithOptions方法中将其写下来。

UIApplication.shared.isStatusBarHidden = false
UIApplication.shared.statusBarStyle = UIStatusBarStyle.lightContent

答案 42 :(得分:2)

这似乎是目前Xcode和iOS 7版本的一个问题。

Apple开发者论坛上的一些相关内容位于a search for UIStatusBarStyleLightContent in "iOS 7 Beta Livability" on the Apple Developer Forums *(目前有32个帖子)。

我试图将它设置为轻型版本。

(这只是对Aaron答案的跟进。)

答案 43 :(得分:2)

  • 删除.plist文件中的查看基于控制器的状态栏外观(如果您已创建)并重新创建它。

  • 状态栏样式设置为不透明的黑色样式

在appDelegate中,在didFinishLaunching下添加以下代码。

 [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

答案 44 :(得分:2)

更改所有ViewControllers的状态栏文本颜色

swift 3

如果在Info.plist中查看基于控制器的状态栏外观= YES

然后将此扩展名用于所有NavigationController

extension UINavigationController
{
    override open var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
     }
 }

如果没有UINavigationController且只有UIViewController,那么使用下面的代码:

extension UIViewController
{
    override open var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
     }
 }

目标c

创建类别类

对于UIViewController

在UIViewController + StatusBarStyle.h

 @interface UIViewController (StatusBarStyle)
 @end

在UIViewController + StatusBarStyle.m

 #import "UIViewController+StatusBarStyle.h"

 @implementation UIViewController (StatusBarStyle)
 -(UIStatusBarStyle)preferredStatusBarStyle
 {
  return UIStatusBarStyleLightContent;
 }
 @end 

适用于UINavigationController

在UINavigationController + StatusBarStyle.h

 @interface UINavigationController (StatusBarStyle)
 @end

在UINavigationController + StatusBarStyle.m

 #import "UINavigationController+StatusBarStyle.h"

 @implementation UINavigationController (StatusBarStyle)
 -(UIStatusBarStyle)preferredStatusBarStyle
 {
  return UIStatusBarStyleLightContent;
 }
 @end  

答案 45 :(得分:2)

只需更改 1) Info.plist查看基于控制器的状态栏appearance - &gt; NO 和写 的 2)

  [[UIApplication
 sharedApplication]setStatusBarStyle:UIStatusBarStyleLightContent]; 

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

答案 46 :(得分:2)

这对我有用:

  1. UIViewControllerBasedStatusBarAppearance

  2. 中将YES设为plist
  3. rootViewController需要

    的方法实现
    -(UIStatusBarStyle)preferredStatusBarStyle
    
  4. 由于我的rootViewController由Cocoapods(JASidePanelController)管理,因此我通过以下类别添加了此方法:

    #import "JASidePanelController+StatusBarStyle.h"
    
    @implementation JASidePanelController (StatusBarStyle)
    
    - (UIStatusBarStyle)preferredStatusBarStyle
    {
        return UIStatusBarStyleLightContent;
    }
    
    @end
    

答案 47 :(得分:1)

在iOS 7上,如果你想使用UIViewControllerBasedStatusBarAppearance == YES,你的根视图控制器是UINavigationController,你应该 将它子类化并重载childViewControllerForStatusBarStyle,例如,像这样:

- (UIViewController*) childViewControllerForStatusBarStyle
{
    return self.viewControllers.lastObject;
}

在此之后,将在推送的视图控制器上调用preferredStatusBarStyle。

答案 48 :(得分:1)

您可以在iOS 6和7中使用它:

#ifdef __IPHONE_7_0
# define STATUS_STYLE UIStatusBarStyleLightContent
#else
# define STATUS_STYLE UIStatusBarStyleBlackTranslucent
#endif

[[UIApplication sharedApplication] setStatusBarStyle:STATUS_STYLE animated:YES];

答案 49 :(得分:1)

请试试这个

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
    [application setStatusBarHidden:NO];
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
    UIView *statusBar = [[[UIApplication sharedApplication] valueForKey:@"statusBarWindow"] valueForKey:@"statusBar"];
    if ([statusBar respondsToSelector:@selector(setBackgroundColor:)]) {
        statusBar.backgroundColor = [UIColor blackColor];
    }

答案 50 :(得分:1)

iOS 13解决方案

UINavigationControllerUIViewController(谁知道?)的子类!

因此,当展示嵌入在导航控制器中的视图控制器时,并不是真正展示嵌入的视图控制器;您正在展示导航控制器! UINavigationController作为UIViewController的子类,继承了preferredStatusBarStylechildForStatusBarStyle,您可以根据需要设置它们。

以下任何一种方法都可以使用:

  1. 完全退出暗模式
    • 在您的info.plist中,添加以下属性:
      • 键-UIUserInterfaceStyle(又称“用户界面样式”)
      • 价值-轻
  2. preferredStatusBarStyle内覆盖UINavigationController

    • preferredStatusBarStyledoc)-视图控制器的首选状态栏样式
    • 子类或扩展UINavigationController

      class MyNavigationController: UINavigationController {
          override var preferredStatusBarStyle: UIStatusBarStyle {
              .lightContent
          }
      }
      

      OR

      extension UINavigationController {
          open override var preferredStatusBarStyle: UIStatusBarStyle {
              .lightContent
          }
      }
      
  3. childForStatusBarStyle内覆盖UINavigationController

    • childForStatusBarStyledoc)-在系统需要视图控制器用于确定状态栏样式时调用
    • 根据Apple的文档,
        

      “如果容器视图控制器从其子视图控制器之一派生其状态栏样式,请[重写此属性]并返回该子视图控制器。如果返回nil或不重写此方法,则状态栏样式为使用self。如果此方法的返回值发生变化,请调用setNeedsStatusBarAppearanceUpdate()方法。“

    • 换句话说,如果您不在此处实现解决方案3,则系统将退回到上述解决方案2。
    • 子类或扩展UINavigationController

      class MyNavigationController: UINavigationController {
          override var childForStatusBarStyle: UIViewController? {
              topViewController
          }
      }
      

      OR

      extension UINavigationController {    
          open override var childForStatusBarStyle: UIViewController? {
              topViewController
          }
      }
      
    • 您可以返回上面想要的任何视图控制器。我推荐以下之一:

      • {{1}中的topViewControllerdoc)-导航堆栈顶部的视图控制器
      • UINavigationController(共visibleViewController个)(doc)-与导航界面中当前可见视图关联的视图控制器(提示:这可以包括“已显示的视图控制器在导航控制器本身的顶部”)

注意:如果您决定继承UINavigationController的子类,请记住通过IB中的身份检查器将该类应用于您的导航控制器。

P.S。这适用于iOS 13?

答案 51 :(得分:0)

我必须为swift和导航控制器做些什么

extension UINavigationController {
    override open var preferredStatusBarStyle: UIStatusBarStyle {
       return .lightContent
    }   
}

答案 52 :(得分:0)

这是一个更好的解决方案 扩展导航控制器并放入故事板

class NVC: UINavigationController {

    override var preferredStatusBarStyle: UIStatusBarStyle {
              return .lightContent
    }

    override func viewDidLoad() {
        super.viewDidLoad()

    self.navigationBar.isHidden = true
    self.navigationController?.navigationBar.isTranslucent = false
      
     self.navigationBar.barTintColor = UIColor.white
     setStatusBarColor(view : self.view)
    }
    

    func setStatusBarColor(view : UIView){
             if #available(iOS 13.0, *) {
                 let app = UIApplication.shared
                 let statusBarHeight: CGFloat = app.statusBarFrame.size.height
                 
                 let statusbarView = UIView()
              statusbarView.backgroundColor = UIColor.black
                 view.addSubview(statusbarView)
               
                 statusbarView.translatesAutoresizingMaskIntoConstraints = false
                 statusbarView.heightAnchor
                     .constraint(equalToConstant: statusBarHeight).isActive = true
                 statusbarView.widthAnchor
                     .constraint(equalTo: view.widthAnchor, multiplier: 1.0).isActive = true
                 statusbarView.topAnchor
                     .constraint(equalTo: view.topAnchor).isActive = true
                 statusbarView.centerXAnchor
                     .constraint(equalTo: view.centerXAnchor).isActive = true
               
             } else {
                 let statusBar = UIApplication.shared.value(forKeyPath: "statusBarWindow.statusBar") as? UIView
              statusBar?.backgroundColor = UIColor.black
             }
         }
}

状态栏颜色为黑色,文字为白色

答案 53 :(得分:0)

此解决方案适用于使用 新 SwiftUI Lifecycle / iOS 14.0 的应用:

我需要动态更改状态栏文本颜色,但无法访问 window.rootViewController,因为 SwiftUI 生命周期中不存在 SceneDelegate

我终于找到了 Xavier Donnellon 的这个简单的解决方案:https://github.com/xavierdonnellon/swiftui-statusbarstyle

StatusBarController.swift 文件复制到您的项目中并将您的主视图包装到 RootView 中:

@main
struct ProjectApp: App {     
    var body: some Scene {
        WindowGroup {
            //wrap main view in RootView
            RootView {
                //Put the view you want your app to present here
                ContentView()
                    //add necessary environment objects here 
            }
        }
    }
}

然后您可以通过使用 .statusBarStyle(.darkContent).statusBarStyle(.lightContent) 视图修饰符,或通过调用例如更改状态栏文本颜色UIApplication.setStatusBarStyle(.lightContent) 直接。

不要忘记在 Info.plist 中将“基于视图控制器的状态栏外观”设置为“是”。

答案 54 :(得分:0)

If you want to set it to any color, use below code.

id statusBarWindow = [[UIApplication sharedApplication] valueForKey:@"statusBarWindow"];
id statusBar = [statusBarWindow valueForKey:@"statusBar"];

SEL setForegroundColor_sel = NSSelectorFromString(@"setForegroundColor:");
if([statusBar respondsToSelector:setForegroundColor_sel]) {
    // iOS 7+
    [statusBar performSelector:setForegroundColor_sel withObject:YourColorHere];
                                                                 ^^^^^^^^^^^^^
}

I know I am accessing private API, but I have used this in many projects and Apple have approved it.

Just while submitting the app, send this code to Apple in Comments section and inform that you are using this code to change the status bar color.

And yes, don't forget below too.

答案 55 :(得分:-1)

"Finder": {
    "Id": "23216245567u4",
    "ElemId": "finder",
    "Title": "Your Finder",
    "Description": "This is a description",
    "ResultsTitle": "What program or service are you looking for?",
    "CategoryTitle": "Great! Select a category to continue..",
    "Results": [
       {
         ...
       }
       {
         ...
       }
    ]
}
let finder = this.state.finder;
console.log(finder.Results);

for (var i = 0; i < finder.Results.length; i++) {
  console.log(finder.Results[i]); 
}

答案 56 :(得分:-2)

非常简单的方法更改状态栏颜色。 创建导航控制器的子类。

在view didload方法中编写此代码。 在所有视图控制器中实现此代码

self.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName :
                                                                        [UIColor whiteColor],
                                               NSFontAttributeName:[UIFont boldSystemFontOfSize:19]};