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

Posted

技术标签:

【中文标题】在 iPhone 上切换应用时更改状态栏颜色的问题【英文标题】:A issue on Changing the Color of the Status Bar when switching apps on iPhone 【发布时间】:2018-04-25 07:38:52 【问题描述】:

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

根据 *** 的回答,我做到了。

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

没关系。请注意状态栏。

不行。请注意状态栏。

我想不通。我试过的代码:

    设置statusBar.backgroundColor

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

2. 将子视图插入状态栏。

 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)也是如此。

我尝试用断点分析它。

- 当应用处于活动状态时,双击 Home 键切换应用,该方法不调用 - (void)viewWillDisappear:(BOOL)animated 。这让我有点困惑。

- 我尝试在Application的方法- (void)applicationWillResignActive:(UIApplication *)application中更改状态栏的背景颜色,它不起作用。我不知道为什么。

虽然来自 Github 的源代码,通过 Runtime 就可以了。我的公司不喜欢使用 Runtime

还有其他方法无需运行时吗?

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

主要问题是解决它无需运行时。欢迎更多解释。我认为这很容易,我想念什么?

非常感谢您的进步。

【问题讨论】:

当您的应用处于非活动状态时,您无法更改状态栏颜色。当您在应用程序切换器窗口中时,操作系统控制状态栏的颜色,因为您的应用程序不是窗口上的活动应用程序。所以我不认为你想要做的事情是可能的。 感谢您的回复。 This repo 可以在运行时使用。而应用 meetup 也做得更复杂。 你说得对,我通过改变View来调整状态栏位置的背景色, 【参考方案1】:

Swift 4 的答案:

并且适合navigationViewController管理的viewController的情况

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];

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

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

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

【讨论】:

请有人写 swift 版本! 已更新。希望你喜欢 ViewCantroller 从下到上弹出时不工作。 当然。 ViewController 层次结构不同。我的情况是 Navigation Push 。也许你应该问一个新问题,并留下一个链接@TusharLathiya【参考方案2】:

根据之前的答案修改:

struct Utility 
    static var statusBarBgView =  () -> UIView in
        let statusBarBgView = UIView(frame: UIApplication.shared.statusBarFrame)
        return statusBarBgView
    ()


extension UIViewController 

    func setupStatusBar(statusBarBgView: inout UIView) 
        UIApplication.shared.statusBarStyle = .lightContent
        statusBarBgView.backgroundColor = .red
        let navigationBar = self.navigationController?.navigationBar
        UIApplication.shared.keyWindow!.insertSubview(statusBarBgView, aboveSubview: navigationBar!)
    


// Usage:
self.setupStatusBar(statusBarBgView: &Utility.statusBarBgView)

【讨论】:

以上是关于在 iPhone 上切换应用时更改状态栏颜色的问题的主要内容,如果未能解决你的问题,请参考以下文章

如何更改 iPhone 应用程序中状态栏的颜色? [复制]

表格 iPhone 在顶部更改颜色

如何在 iOS 7 上更改状态栏背景颜色和文本颜色?

iOS 状态栏更改颜色

在Android中更改状态栏颜色

导航栏隐藏XCode时状态栏更改色调颜色