在iOS8中使用Swift更改特定ViewController的状态栏颜色
override func preferredStatusBarStyle() -> UIStatusBarStyle { return UIStatusBarStyle.LightContent; }
在任何ViewController中使用上面的代码来设置statusBar颜色为白色的特定的viewcontroller 不适用于我的iOS8 。 有什么build议么? 使用UIApplication.sharedApplication方法,在整个应用程序的Info.plist中进行所需更改后,颜色会发生变化。
// Change the colour of status bar from black to white UIApplication.sharedApplication().statusBarStyle = .LightContent
我如何才能更改状态栏颜色的一些必需和特定的ViewControllers ?
读完所有的build议,并尝试了一些事情,我可以得到这个工作的具体viewcontrollers使用以下步骤:
第一步:
打开你的info.plist并将一个名为“ View controller-based status bar appearance ”的新密钥插入到NO
第二步(只是一个解释,不需要执行此操作):
通常我们把下面的代码放在AppDelegate的应用程序(_:didFinishLaunchingWithOptions :)方法中,
Swift 2
UIApplication.sharedApplication().statusBarStyle = .LightContent
Swift 3
UIApplication.shared.statusBarStyle = .lightContent
但是会影响所有ViewController的statusBarStyle
。
所以,如何让这个工作的具体ViewControllers – 最后一步:
打开您想要更改statusBarStyle
的viewcontroller文件,并将以下代码放在viewWillAppear()
,
Swift 2
UIApplication.sharedApplication().statusBarStyle = .LightContent
Swift 3
UIApplication.shared.statusBarStyle = .lightContent
另外,为那个特定的viewController实现viewWillDisappear()
方法,并把下面的代码行,
Swift 2
override func viewWillDisappear(animated: Bool) { super.viewWillDisappear(animated) UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.Default }
Swift 3
override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) UIApplication.shared.statusBarStyle = UIStatusBarStyle.default }
此步骤将首先更改特定视图控制器的statusBarStyle
,然后在特定视图控制器消失时将其更改回default
。 不实现viewWillDisappear()
会将statusBarStyle
永久地更改为新定义的UIStatusBarStyle.LightContent
(截至2017年7月13日)
Swift 3和Swift 3.1
override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) UIApplication.shared.statusBarStyle = .lightContent } override var preferredStatusBarStyle : UIStatusBarStyle { return .lightContent }
我遵循这个教程,它为我工作。 但是,我不确定是否有任何警告。
https://coderwall.com/p/dyqrfa/customize-navigation-bar-appearance-with-swift
- 打开你的info.plist并将
UIViewControllerBasedStatusBarAppearance
设置为false
。 - 在
AppDelegate.swift
的第一个函数中,它包含didFinishLaunchingWithOptions
,设置你想要的颜色。
UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.LightContent
在您的Info.plist中,您需要将基于视图控制器的状态栏外观定义为任何值。
如果将其定义为YES,则应该在每个视图控制器中重写preferredStatusBarStyle函数。
如果你定义它,那么你可以使用AppDelegate设置样式
UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true)
override func viewWillAppear(animated: Bool) { self.navigationController?.navigationBarHidden = true UIApplication.sharedApplication().statusBarHidden = false UIApplication.sharedApplication().statusBarStyle = .LightContent let statusBar: UIView = UIApplication.sharedApplication().valueForKey("statusBar") as! UIView if statusBar.respondsToSelector("setBackgroundColor:") { statusBar.backgroundColor = UIColor.redColor() } }
Swift 3
let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView if statusBar.responds(to: #selector(setter: UIView.backgroundColor)) { statusBar.backgroundColor = UIColor.black }
这是为特定的视图控制器设置状态栏的背景颜色的解决scheme。
SWIFT 2
我能够通过在我的viewWillAppear中添加以下内容来成功更改状态栏背景的外观:
let statusBar: UIView = UIApplication.sharedApplication().valueForKey("statusBar") as! UIView if statusBar.respondsToSelector(Selector("setBackgroundColor:")) { statusBar.backgroundColor = .redColor() }
像上面提到的那样实现preferredStatusBarStyle
,并在ViewDidLoad
调用self.setNeedsStatusBarAppearanceUpdate()
,在Info.plist中也将UIViewControllerBasedStatusBarAppearance
设置为YES
(默认为YES
)
不清楚为什么它不工作。我需要检查code.One其他build议是与工作代码在viewDidLoad
UIApplication.sharedApplication().statusBarStyle = .LightContent
并将其更改为默认当您查看get消失viewWillDisappear
。
在我的情况下,我使用故事板来组织我的视图controllers.I想改变所有的状态栏风格。
你可以看到下面的图片。
Stars
View Controller是一个CPBaseNavigationController
, CPBaseNavigationController
是UINavigationController
子类。
我试着做下一步:
-
在
AppDelegate.swift
funcdidFinishLaunchingWithOptions
,添加//change status bar color UIApplication.sharedApplication().statusBarHidden = false UIApplication.sharedApplication().statusBarStyle = .LightContent
但没有效果。
-
在StoryBoard中,find
Base Tab BarController
(Base Tab BarController
图片)。selectAttributes Inspector
,将Sattus Bar
属性更改为Light Content
。所以不好,不起作用。
-
最后我得到它。在我的自定义导航控制器
CPBaseNavigationController
,添加funcpreferredStatusBarStyle
override func preferredStatusBarStyle() -> UIStatusBarStyle { return .LightContent }
它运作良好!
另外,在9.0中不推荐使用statusBarStyle
,你可以使用-[UIViewController preferredStatusBarStyle]
。
这里有十亿个答案,所以我想为什么不以扩展的forms添加另一个(在@Cœur的帮助下)
Swift 3
延期:
extension UIApplication { class var statusBarBackgroundColor: UIColor? { get { return (shared.value(forKey: "statusBar") as? UIView)?.backgroundColor } set { (shared.value(forKey: "statusBar") as? UIView)?.backgroundColor = newValue } } }
执行:
UIApplication.statusBarBackgroundColor = .blue
适用于基于导航的应用
var addStatusBar = UIView() addStatusBar.frame = CGRectMake(0, 0, UIScreen.mainScreen().bounds.width, 20); addStatusBar.backgroundColor = global().UIColorFromRGB(0x65b4d9) self.window?.rootViewController?.view .addSubview(addStatusBar)
Swift 3
// // LoginController.swift // Swift 3 // // Created by The Crab on 17/01/2017. // Copyright © 2017 Paxi Labs. All rights reserved. // import UIKit class LoginController: UIViewController { override func viewDidLoad() { super.viewDidLoad() setNeedsStatusBarAppearanceUpdate() view.backgroundColor = UIColor(red: 61/255, green: 91/255, blue: 151/255, alpha: 1) } override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent } }
在Swift 3.0 Xcode 8中,所有东西都容易得多
在App Delegate文件中使用下面的代码
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
插入这个:
UINavigationBar.appearance().barStyle = .black UINavigationBar.appearance().barTintColor = UIColor(red: 230, green: 32, blue: 31, alpha: 1.0)
我在App Delegate
文件中使用下面的代码设置了特定的颜色(RGB格式):
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { . . . UIApplication.sharedApplication().statusBarHidden = false UIApplication.sharedApplication().statusBarStyle = .LightContent let statusBar: UIView = UIApplication.sharedApplication().valueForKey("statusBar") as! UIView if statusBar.respondsToSelector(Selector("setBackgroundColor:")) { statusBar.backgroundColor = UIColor.init(red: 0.1, green: 0.27, blue: 0.60, alpha: 1.0) } . . . }
您还需要在Info.plist
文件中添加下面的键:
查看基于控制器的状态栏外观 ,布尔值设置为NO
为迅速3
的.plist
View controller-based status bar appearance = NO
AppDelegate.swift
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // Custom statubar UIApplication.shared.isStatusBarHidden = false UIApplication.shared.statusBarStyle = .lightContent let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView statusBar.backgroundColor = UIColor.gray return true }
我可以build议你一个更简单的方法,
- 只要在viewDidLoad中调用setNeedsStatusBarAppearanceUpdate ,就像苹果文档所说的那样,
如果视图控制器的状态栏属性(如隐藏/未隐藏状态或样式)发生更改,请调用此方法。 如果您在animation块中调用此方法,则会随着animation块的其余部分一起animation更改。
- 实现preferredStatusBarStyle返回您的首选types。
它在iOS 10.1中为我工作。
目标C
[self setNeedsStatusBarAppearanceUpdate]; -(UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleLightContent; }
迅速
setNeedsStatusBarAppearanceUpdate() var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }
我很惊讶没有人指出这一点。 无论如何享受:)
Swift 3.0更新
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { UIApplication.shared.statusBarStyle = .lightContent return true }
我遇到了这个问题 我并没有真正感觉到全局改变状态栏的颜色在视图中确实出现,然后在视图上改变它就像接受的答案一样消失。 相信与否你可以通过在你想要的视图控制器上覆盖preferredStatusBarStyle
来获得这个工作。 经过很多时间,这是我所做的工作:
- 将您的
info.plist
基于视图控制器的状态栏外观更改为YES。 - 现在,任何全屏视图控制器都可以通过覆盖
preferredStatusBarStyle
来更改状态栏样式。 - 我指定全屏幕,因为这不适用于(非全屏幕)模式视图控制器,而不是没有设置
modalPresentationCapturesStatusBarAppearance
为是。 -
另外,如果你有embedded的视图控制器,例如在导航控制器中,它会询问最顶层的视图控制器的状态栏样式。 覆盖
childViewControllerForStatusBarStyle
和传递embedded视图控制器应该工作,但它不适合我。 所以我刚刚返回embedded视图控制器首选状态栏作为首选的状态栏风格。 像这样的东西:override var preferredStatusBarStyle: UIStatusBarStyle { if let topViewController = viewControllers.last { return topViewController.preferredStatusBarStyle } return .default }
点击支持文件组(您的项目的左上angular名称)。 导航到信息。 点击列表之间的某处,如下面的包名称。 并添加“查看基于控制器的状态栏出现”并将其设置为NO。 然后打开AppDelegate.swift并像这样修改:
func application(application: UIApplication!, didFinishLaunchingWithOptions launchOptions: NSDictionary!) -> Bool { UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true) return true }
而已。
我文学上也涉及到这个问题。 花了我4个多小时弄清楚了。 我试着在这里给出的所有答案,我得到的最好的是到标题状态栏白色。 但是不pipe我做了什么,其他一些东西,比如电池条等,仍然是黑色的:关于应用这个问题提供的所有解决scheme。 所以我决定回溯我的步骤,并了解到我已经下载了一个CocoaPod依赖项,它正在改变Xcode的正常function和改变颜色的代码。 对我来说,这是“变色龙框架”的依赖。 所以我build议你检查你从CocoaPods安装的依赖关系,如果你已经应用了所有的解决scheme并且没有为你工作,删除最新的依赖关系。
Swift 3.0:
UIApplication.shared.statusBarStyle = .lightContent
在Storyboard中,与我共事的是导航控制器,select导航栏,点击属性检查器,然后将样式从默认改为黑色。 而已!
Swift 3
在你的AppDelegate
文件里面有func application
方法
let statusBar: UIView = application.value(forKey: "statusBar") as! UIView statusBar.backgroundColor = .red
Swift 4.0请使用此代码在“didFinishLaunchingWithOptions launchOptions:”Appdelegate类
UIApplication.shared.statusBarStyle = .lightContent let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView if statusBar.responds(to: #selector(setter: UIView.backgroundColor)){ statusBar.backgroundColor = UIColor.black }