更改状态栏的颜色 [重复]
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 appearance
到 NO
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'文件中设置UIViewControllerBasedStatusBarAppearance
到NO
。
如果您想设置状态栏样式,请在视图控制器级别执行以下步骤:
-
如果您只需要在 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)
【讨论】:
以上是关于更改状态栏的颜色 [重复]的主要内容,如果未能解决你的问题,请参考以下文章