在iPhone上切换应用程序时更改状态栏颜色的问题

我想用特定的视图控制器来改变状态栏的颜色。

根据StackOverFlow的答案,我实现了它。

一个问题 ,当在iPhone上切换应用程序时,我设置的颜色淡入淡出,回到初始状态。

没关系。 请注意状态栏。

在这里输入图像说明

不好。 请注意状态栏。

在这里输入图像说明 我无法弄清楚。 我试过的代码是:

  1. 设置statusBar.backgroundColor

     UIView *statusBar = [[[UIApplication sharedApplication] valueForKey:@"statusBarWindow"] valueForKey:@"statusBar"]; if ([statusBar respondsToSelector:@selector(setBackgroundColor:)]) { statusBar.backgroundColor = [UIColor redColor ]; } 

2.将subview插入到状态栏。

  UIView *statusBar = [[[UIApplication sharedApplication] valueForKey:@"statusBarWindow"] valueForKey:@"statusBar"]; UIView * backgroundColorView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 375, 20) ]; backgroundColorView.autoresizingMask = UIViewAutoresizingFlexibleWidth; backgroundColorView.backgroundColor = [UIColor redColor ]; [statusBar.subviews.firstObject insertSubview: backgroundColorView atIndex:0]; 

3.插入层(CALayer)也是如此。

我试图用断点来分析它。

当应用程序处于活动状态,并双击主页button切换应用程序时,不调用该方法- (void)viewWillDisappear:(BOOL)animated 。 它让我困惑了一下。

我试图改变应用程序的方法- (void)applicationWillResignActive:(UIApplication *)application的状态栏的背景颜色,它不起作用。 我不知道为什么。

而从Github的源代码, 通过运行时没关系 。 我的公司不喜欢使用运行时

没有运行时的其他方式?

我不知道运行时如何与iPhone的切换应用程序模式交互。

主要的问题是解决它没有运行时 。 更多的解释是欢迎的。 我觉得这很容易,我错过了什么?

非常感谢进步。

回答Swift 4:

它适合navigationViewControllerpipe理的viewControllers的情况

 class ViewController: UIViewController { let statusBarBgView = { () -> UIView in let statusBarWindow: UIView = UIApplication.shared.value(forKey: "statusBarWindow") as! UIView let statusBarBgView = UIView(frame: (statusBarWindow.statusBar?.bounds)!) return statusBarBgView }() override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) UIApplication.shared.statusBarStyle = .lightContent let navigationBar = self.navigationController?.navigationBar self.statusBarBgView.backgroundColor = UIColor.red navigationBar?.superview?.insertSubview(self.statusBarBgView, aboveSubview: navigationBar!) } override func viewWillDisappear(_ animated: Bool) { self.statusBarBgView.removeFromSuperview() super.viewWillDisappear(animated) } } extension UIView { var statusBar: UIView? { return value(forKey: "statusBar") as? UIView } } 

Objective-C的答案:

 -(void)viewWillAppear:(BOOL)animated{ [super viewWillAppear: animated]; [UIApplication sharedApplication].statusBarStyle=UIStatusBarStyleLightContent; UINavigationBar *navigationBar = self.navigationController.navigationBar; UIView *statusBar = [[[UIApplication sharedApplication] valueForKey:@"statusBarWindow"] valueForKey:@"statusBar"]; self.statusBarBgView = [[UIView alloc ] initWithFrame: statusBar.bounds ]; self.statusBarBgView.backgroundColor = [UIColor redColor ]; [navigationBar.superview insertSubview: self.statusBarBgView aboveSubview: navigationBar]; } - (void)viewWillDisappear:(BOOL)animated { [self.statusBarBgView removeFromSuperview ]; [super viewWillDisappear:animated]; } 

显示OS信息的状态栏是UIWindow ,由应用程序切换窗口中的操作系统控制。

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

因此,在应用程序切换器窗口中,通过更改视图来调整状态栏位置的背景颜色即可。