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

问题描述 投票:2回答:2

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

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

有一个问题,当在iPhone上切换应用程序时,我设置的颜色会消失,然后回到初始状态。

没关系。请注意状态栏。

enter image description here

不好。请注意状态栏。

enter image description here我无法理解。我试过的代码:

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

2.将子视图插入statusBar。

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

我试图用断点来分析它。

- 当应用程序处于活动状态时,双击“主页”按钮切换应用程序,该方法不会被称为- (void)viewWillDisappear:(BOOL)animated。这让我有点困惑。

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

从Github的源代码来看,通过Runtime可以。我的公司不喜欢使用Runtime。

没有运行时还有其他方法吗?

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

主要问题是在没有运行时解决它。欢迎提供更多解释。我觉得很容易,我想念什么?

非常感谢先进。

ios iphone statusbar
2个回答
2
投票

Swift 4的答案:

它适合由navigationViewController管理的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"];

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


0
投票

从以前的答案修改:

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)
© www.soinside.com 2019 - 2024. All rights reserved.