代码之家  ›  专栏  ›  技术社区  ›  dengApro

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

  •  2
  • dengApro  · 技术社区  · 7 年前

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

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

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

    没关系。 请注意状态栏。

    enter image description here

    不太好。 请注意状态栏。

    enter image description here 我想不出来。我尝试的代码:

    1. 设置 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 . 这让我有点困惑。

    - - (void)applicationWillResignActive:(UIApplication *)application ,它不起作用。我不知道为什么。

    虽然来自Github的源代码, 在运行时一切正常 . 我的公司不喜欢使用 运行时 .

    还有别的办法吗 没有运行时

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

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

    非常感谢进步。

    2 回复  |  直到 7 年前
        1
  •  2
  •   dengApro    7 年前

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

    显示操作系统信息的状态栏 ,在app switcher窗口中由操作系统控制。

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

    所以可以调整 状态栏位置 通过更改 看法

        2
  •  0
  •   MrRhoads    6 年前

    根据之前的答案修改:

    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)