如何使用 swift 在一个视图控制器中更改状态栏颜色?
Posted
技术标签:
【中文标题】如何使用 swift 在一个视图控制器中更改状态栏颜色?【英文标题】:how to change statusbar color in one view controller using swift? 【发布时间】:2016-05-05 20:50:34 【问题描述】:UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true)
我用这个来改变所有应用程序中的状态栏。但现在我只需要在一个 View Controller 中将它改回黑色。我该怎么做?
【问题讨论】:
Changing the Status Bar Color for specific ViewControllers using Swift in ios8的可能重复 【参考方案1】:在你的 project.plist 中将 View controller-based status bar appearance
设置为 NO
使用viewWillAppear
和viewWillDisappear
来设置和重置statusBarStyle,同时保持与之前statusBarStyle 类似的属性
let initialStatusBarStyle : UIStatusBarStyle
func viewWillAppear(animated: Bool)
super.viewWillAppear(animated)
initialStatusBarStyle = UIApplication.sharedApplication().statusBarStyle
UIApplication.sharedApplication().setStatusBarStyle(.LightContent, animated: animated)
func viewWillDisappear(animated: Bool)
super.viewWillDisappear(animated)
UIApplication.sharedApplication().setStatusBarStyle(initialStatusBarStyle, animated: animated)
【讨论】:
嗯,但它应该。发生了什么 这是我的错误。我错过了您的短语“在 project.plist 中将基于视图控制器的状态栏外观设置为 NO”。现在它起作用了。谢谢! 很高兴它成功了,您可能想将您的问题标记为已回答 @MarkHim 当我使用它并使用选项卡式导航在两个 VC 之间切换时它不起作用。 ***.com/questions/38546787/…UIApplication.shared.setStatusBarStyle(initialStatusBarStyle, animated: true)
在 iOS 9 中已弃用。您可能需要更新代码。使用UIApplication.shared.statusBarStyle = initialStatusBarStyle
。【参考方案2】:
Xcode 8.1,带有@IBDesignable 的 Swift 3 解决方案
这个解决方案有点不同:
UIViewController 的子类集中逻辑 没有 viewDidLoad 或 viewDidDisappear 的代码 使用@IBDesignable,因此您可以在情节提要的属性检查器中设置状态栏颜色第 1 步 - 设置 Info.plist 文件
第 2 步 - 子类 UIViewController
import UIKit
@IBDesignable
class DesignableViewController: UIViewController
@IBInspectable var LightStatusBar: Bool = false
override var preferredStatusBarStyle: UIStatusBarStyle
get
if LightStatusBar
return UIStatusBarStyle.lightContent
else
return UIStatusBarStyle.default
第 3 步 - 从 DesignableViewController 继承
从以下位置更改您的 ViewController(s) 的代码:
class ViewController: UIViewController
收件人:
class ViewController: DesignableViewController
第 4 步 - 在情节提要上设置您的偏好
选择 Storyboard 上的 ViewControllers 并转到 Attributes Inspector:
第 5 步 - 运行项目并测试
在我的项目中,我设置了一个带有 2 个视图控制器的选项卡栏控制器,并在两者之间来回切换。对我来说似乎工作正常。
【讨论】:
这太棒了!很棒的解决方案。【参考方案3】:已解决: 斯威夫特 3.1
只需在 View Controller 中使用此代码:
override var preferredStatusBarStyle: UIStatusBarStyle
return .lightContent
【讨论】:
完美,谢谢!自动完成不会显示这一点,因为它是一个 var,但它可以 100% 工作!【参考方案4】:斯威夫特 3
将 project.plist 中基于视图控制器的状态栏外观设置为 NO
override func viewWillDisappear(_ animated: Bool)
super.viewWillDisappear(animated)
UIApplication.shared.setStatusBarStyle(.default, animated: animated)
override func viewWillAppear(_ animated: Bool)
super.viewWillAppear(animated)
UIApplication.shared.setStatusBarStyle(.lightContent, animated: animated)
【讨论】:
【参考方案5】:Objective-C
回答:
-(void)viewWillDisappear:(BOOL)animated
[super viewWillDisappear:animated];
[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleDefault;
-(void)viewWillAppear:(BOOL)animated
[super viewWillAppear:animated];
[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;
【讨论】:
【参考方案6】: let color = UIColor(red:0.00, green:0.60, blue:0.48,alpha:1.0)
UINavigationBar.appearance().tintColor = UIColor.blue
UINavigationBar.appearance().barTintColor = color
或
self.navigationController?.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.white]
【讨论】:
【参考方案7】:在 swit4 中,这在我基于导航栏的项目中运行良好
let app = UIApplication.shared
let statusBarHeight: CGFloat = app.statusBarFrame.size.height
let statusbarView = UIView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: statusBarHeight))
statusbarView.backgroundColor = UIColor.red
view.addSubview(statusbarView)
【讨论】:
【参考方案8】:您可以使用下面的代码设置状态栏颜色,它对我有用
self.navigationController?.SetStatusBar(StatusBarbackgroundColor: ThemeBackColor, StatusTextColor: .black)
谢谢 快乐编码:)
【讨论】:
【参考方案9】:Swift 5、iOS 14、UIKit
第一步:添加状态栏样式
第 2 步:更改 Info.Plist
添加无值的基于视图控制器的状态栏外观键
第 3 步:在基本视图控制器中添加此扩展
extension UIViewController
func setStatusBarColor()
if #available(iOS 13, *)
let window = UIApplication.shared.windows.filter $0.isKeyWindow.first
let statusBarFrame = window?.windowScene?.statusBarManager?.statusBarFrame
let statusBar = UIView(frame: (statusBarFrame)!)
statusBar.backgroundColor = .orange
window?.addSubview(statusBar)
else
// ADD THE STATUS BAR AND SET A CUSTOM COLOR
let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
if statusBar.responds(to:#selector(setter: UIView.backgroundColor))
statusBar.backgroundColor = .orange
UIApplication.shared.statusBarStyle = .lightContent
第 4 步:在您的视图控制器中使用此扩展程序
override func viewWillAppear(_ animated: Bool)
super.viewWillAppear(animated)
setStatusBarColor()
【讨论】:
【参考方案10】:如果你从一个通用的视图控制器派生了你的视图控制器,那么你可以简单地这样做:
第 1 步:
将此密钥添加到您应用的 info.plist
文件中。
第 2 步:
override
这个在通用视图控制器中(或 ParentViewController
)。
override var preferredStatusBarStyle: UIStatusBarStyle
if self is YourChildViewController
return .lightContent
return .default
就是这样!没有更多花哨的东西。
【讨论】:
return .default
在这种情况下永远不会被执行【参考方案11】:
当您处于不会被调用的导航控制器中时。导航控制器的 preferredStatusBarStyle 将被调用。与您的代码一起尝试:
extension UINavigationController
open override var preferredStatusBarStyle: UIStatusBarStyle
return topViewController?.preferredStatusBarStyle ?? .default
还要这样写:
override var preferredStatusBarStyle: UIStatusBarStyle
return .lightContent
【讨论】:
以上是关于如何使用 swift 在一个视图控制器中更改状态栏颜色?的主要内容,如果未能解决你的问题,请参考以下文章