更改状态栏的颜色 [重复]

Posted

技术标签:

【中文标题】更改状态栏的颜色 [重复]【英文标题】:Changing the Color of the Status Bar [duplicate] 【发布时间】:2017-08-21 18:24:45 【问题描述】:

我正在尝试将状态栏的颜色更改为蓝色或其他颜色。

这是可能的,还是苹果不允许?

【问题讨论】:

基于两个答案(使用 cmets),答案(就像我想的那样)是 no。您可以 (1) 更改状态栏的字体颜色或 (2) 使用私有 API,但您有可能被 Apple 拒绝您的应用程序(或者更糟的是,在某处拒绝它)。 【参考方案1】:

注意:此解决方案在 iOS 13 及更高版本下失败。

Plist 中的第一个集合 View controller-based status bar appearanceNO

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool 
    // Override point for customization after application launch.

    let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
    if statusBar.responds(to:#selector(setter: UIView.backgroundColor)) 
        statusBar.backgroundColor = UIColor.blue
    
    UIApplication.shared.statusBarStyle = .lightContent

    return true

输出截图如下

【讨论】:

这使用了可能无法通过应用审核的私有、未记录的 API。做这样的事情从来都不是一个好主意。当私有 API 在未来的某些 ios 更新中发生更改时,它可能会崩溃,尤其是在编写时。 我有一个应用程序因此被拒绝,而另一个被接受就好了。他们确实认为这是私有 API 的使用,所以在审查过程中你会受到运气的影响 :) – @Sebyddd 我肯定会在您的回答中添加这个事实。 @rmaddy 你会很高兴知道这段代码最初是为 iOS 10 编写的(并且从那时起就很高兴地工作),在 iOS 13 上运行时会杀死我的应用程序。 @JamieBirch 这并不让我感到高兴,但它确实验证了为什么在私有 API 周围闲逛是一个坏主意。【参考方案2】:

不,使用现成的公共 API 是不可能的。

但随着iOS 7 的发布,您可以更改状态栏的外观。因此,我发布了我的解决方法。

通过覆盖preferredStatusBarStyle从单个视图控制器:

-(UIStatusBarStyle)preferredStatusBarStyle 
 
    return UIStatusBarStyleLightContent; 

或者,您可以使用UIApplication statusBarStyle 方法设置状态栏样式。为此,插入一个名为“View controller-based status bar appearance”的新键并将值设置为 NO。

通过禁用“基于视图控制器的状态栏外观”,您可以使用以下代码设置状态栏样式。

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

最后,更改UINavigationBar 属性的色调颜色,如下所示

[[UINavigationBar appearance] setBarTintColor:[UIColor blueColor]];

【讨论】:

为了澄清您的答案,是否将状态栏背景颜色更改为特定颜色? 这个编辑没有意义。 OP想要更改状态栏,而不是导航栏。 请参考此链接appcoda.com/customize-navigation-status-bar-ios-7 抱歉,我没有看到 OP 的要求。更改状态栏的style 会更改font,而不是背景颜色。我发现与状态栏相关的唯一其他事情就是隐藏它。 (我几年前就知道这个帖子了。它仍然是一个好帖子。但它没有回答设置状态栏背景颜色的具体问题,我认为这是无法使用公共 API 完成的。)跨度> 它实际上并没有解决问题,它只是表明对自定义状态栏的限制。对于这个特定的 OP,正确的答案是“不,公共 API 不可能”。【参考方案3】:

您可以在应用程序启动期间或视图控制器的 viewDidLoad 期间设置状态栏的背景颜色。

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
    


结果如下:

这里是Apple Guidelines/Instruction,关于状态栏的变化。状态栏中只允许使用深色和浅色(白色和黑色)。

这里是 - 如何更改状态栏样式:

如果你想设置状态栏样式,应用程序级别然后在你的`.plist'文件中设置UIViewControllerBasedStatusBarAppearanceNO

如果您想设置状态栏样式,请在视图控制器级别执行以下步骤:

    如果您只需要在 UIViewController 级别设置状态栏样式,请在 .plist 文件中将 UIViewControllerBasedStatusBarAppearance 设置为 YES

    在viewDidLoad添加函数-setNeedsStatusBarAppearanceUpdate

    在您的视图控制器中覆盖 preferredStatusBarStyle。

-

override func viewDidLoad() 
    super.viewDidLoad()
    self.setNeedsStatusBarAppearanceUpdate()


override var preferredStatusBarStyle: UIStatusBarStyle 
    return .lightContent

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

【讨论】:

这应该被更新以表明它在 iOS 13 下崩溃。永远不要使用私有 API。 @rmaddy - 感谢您的更新。我会检查并更新这个答案。【参考方案4】:

这是我的解决方法:创建一个UIView,将其添加到视图控制器的根视图中作为人工状态栏背景 1.创建UIView

// status bar's height is 20.0pt
CGRect frame = CGRectMake(0.0, 0.0, [UIScreen mainScreen].bounds.size.width, 20.0);
UIView *fakeStatusBarBG = [[UIView alloc] initWithFrame:frame];
fakeStatusBarBG.backgroundColor = [UIColor yourColor];

2.将其添加到视图控制器的根视图

// self is your view controller, make sure fakeStatusBarBG is the top subview in your view hierarchy
[self.view insertSubview:fakeStatusBarBG aboveSubview:yourTopSubview];

你去吧。

3.(附加)更改状态栏内容颜色,只有白色或黑色。

- (UIStatusBarStyle)preferredStatusBarStyle

    if (youWantWhiteColor)
    
        return UIStatusBarStyleLightContent;
    
    return UIStatusBarStyleDefault;

此解决方法不使用私有 API,因此您很安全。 :-)

【讨论】:

【参考方案5】:

我做了这个扩展来改变状态栏的颜色

public extension UIViewController 
    func setStatusBar(color: UIColor) 
        let tag = 12321
        if let taggedView = self.view.viewWithTag(tag)
            taggedView.removeFromSuperview()
        
        let overView = UIView()
        overView.frame = UIApplication.shared.statusBarFrame
        overView.backgroundColor = color
        overView.tag = tag
        self.view.addSubview(overView)
    

这是视图控制器中任何地方的用法:

setStatusBar(color: .red)

【讨论】:

以上是关于更改状态栏的颜色 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能更改状态栏的颜色?

如何更改棒棒糖设备状态栏的颜色? [复制]

iOS 7隐藏导航栏时如何更改状态栏的颜色?

在iOS 7中隐藏导航栏时,如何更改状态栏的颜色?

如何更改启动器中状态栏的颜色?

更改状态栏的背景颜色