![](/img/trans.png)
[英]How to change the status bar background color and text color on iOS 7?
[英]How to change the status bar background color and text color on iOS 13?
隨着iOS 13 statusBar 的視圖的到來,不再可以通過以下方式訪問:
value(forKey: "statusBar") as? UIView
由於:
由於未捕獲的異常“NSInternalInconsistencyException”而終止應用程序,原因:“在 UIApplication 上調用 -statusBar 或 -statusBarWindow 的應用程序:必須更改此代碼,因為不再有狀態欄或狀態欄 window。請在 window 場景中使用 statusBarManager object。 '
但不清楚它應該如何用於更改顏色,因為keyWindow?.windowScene?.statusBarManager
似乎不包含任何與之相關的內容。
我正在用 (iOS 10, *) 兼容性編譯我的代碼,所以我打算繼續使用 UIKit。
關於這個主題的任何想法?
您可以添加一些條件或使用第一個條件。 只需為 UIApplication 創建一些擴展。
extension UIApplication {
var statusBarUIView: UIView? {
if #available(iOS 13.0, *) {
let tag = 38482
let keyWindow = UIApplication.shared.windows.filter {$0.isKeyWindow}.first
if let statusBar = keyWindow?.viewWithTag(tag) {
return statusBar
} else {
guard let statusBarFrame = keyWindow?.windowScene?.statusBarManager?.statusBarFrame else { return nil }
let statusBarView = UIView(frame: statusBarFrame)
statusBarView.tag = tag
keyWindow?.addSubview(statusBarView)
return statusBarView
}
} else if responds(to: Selector(("statusBar"))) {
return value(forKey: "statusBar") as? UIView
} else {
return nil
}
}
}
更新:抱歉,我沒有足夠的時間在實際項目中測試它,但它可以在“Hello world”應用程序中運行。 您可以閱讀有關keyWindow和statusBarFrame 的更多信息以使其更好。
extension UIApplication {
var statusBarUIView: UIView? {
if #available(iOS 13.0, *) {
let tag = 3848245
let keyWindow = UIApplication.shared.connectedScenes
.map({$0 as? UIWindowScene})
.compactMap({$0})
.first?.windows.first
if let statusBar = keyWindow?.viewWithTag(tag) {
return statusBar
} else {
let height = keyWindow?.windowScene?.statusBarManager?.statusBarFrame ?? .zero
let statusBarView = UIView(frame: height)
statusBarView.tag = tag
statusBarView.layer.zPosition = 999999
keyWindow?.addSubview(statusBarView)
return statusBarView
}
} else {
if responds(to: Selector(("statusBar"))) {
return value(forKey: "statusBar") as? UIView
}
}
return nil
}
}
不幸的是,Apple 棄用了一些提到的訪問狀態欄和編輯其屬性的方法。 您將不得不使用WindowScene
的StatusBarManager
對象。 以下方法適用於 iOS 13 及更高版本:
extension UINavigationController {
func setStatusBar(backgroundColor: UIColor) {
let statusBarFrame: CGRect
if #available(iOS 13.0, *) {
statusBarFrame = view.window?.windowScene?.statusBarManager?.statusBarFrame ?? CGRect.zero
} else {
statusBarFrame = UIApplication.shared.statusBarFrame
}
let statusBarView = UIView(frame: statusBarFrame)
statusBarView.backgroundColor = backgroundColor
view.addSubview(statusBarView)
}
}
我以前遇到過這個問題。 當我使用 XCode 11 和 Swift 5.0 運行此代碼時,我的應用程序崩潰了。
以前的代碼:-
UIApplication.shared.statusBarView?.backgroundColor = UIColor.init(red: 243/250, green: 243/250, blue: 243/250, alpha: 1)
剛改成:-
if #available(iOS 13.0, *) {
let statusBar = UIView(frame: UIApplication.shared.keyWindow?.windowScene?.statusBarManager?.statusBarFrame ?? CGRect.zero)
statusBar.backgroundColor = UIColor.init(red: 243/250, green: 243/250, blue: 243/250, alpha: 1)
UIApplication.shared.keyWindow?.addSubview(statusBar)
} else {
UIApplication.shared.statusBarView?.backgroundColor = UIColor.init(red: 243/250, green: 243/250, blue: 243/250, alpha: 1)
}
現在我的問題解決了。 快樂編碼。
對於 swift 5.0 我這樣做是為了改變背景顏色,
if #available(iOS 13.0, *) {
let window = UIApplication.shared.windows.filter {$0.isKeyWindow}.first
// Reference - https://stackoverflow.com/a/57899013/7316675
let statusBar = UIView(frame: window?.windowScene?.statusBarManager?.statusBarFrame ?? CGRect.zero)
statusBar.backgroundColor = .white
window?.addSubview(statusBar)
} else {
UIApplication.shared.statusBarView?.backgroundColor = .white
UIApplication.shared.statusBarStyle = .lightContent
}
https://medium.com/@trivediniki94/surprises-after-upgrading-to-xcode-11-ios-13-b52b36e05fa8
這在 Swift 5 中對我有用
override func viewDidLoad() {
super.viewDidLoad()
if #available(iOS 13, *)
{
let statusBar = UIView(frame: (UIApplication.shared.keyWindow?.windowScene?.statusBarManager?.statusBarFrame)!)
statusBar.backgroundColor = #colorLiteral(red: 0.2346, green: 0.3456, blue: 0.5677, alpha: 1)
UIApplication.shared.keyWindow?.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 = #colorLiteral(red: 0.2346, green: 0.3456, blue: 0.5677, alpha: 1)
}
UIApplication.shared.statusBarStyle = .lightContent
}
}
經過測試並 100% 為我工作
func statusBarColorChange(){
if #available(iOS 13.0, *) {
let statusBar = UIView(frame: UIApplication.shared.keyWindow?.windowScene?.statusBarManager?.statusBarFrame ?? CGRect.zero)
statusBar.backgroundColor = AppThemeColor
statusBar.tag = 100
UIApplication.shared.keyWindow?.addSubview(statusBar)
} else {
let statusBar = UIApplication.shared.value(forKeyPath: "statusBarWindow.statusBar") as? UIView
statusBar?.backgroundColor = AppThemeColor
}
}
}
從鍵窗口中刪除狀態欄
func removeStatusBar(){
if #available(iOS 13.0, *) {
UIApplication.shared.keyWindow?.viewWithTag(100)?.removeFromSuperview()
}
}
在viewDidLoad
和viewWillAppear
調用上面的函數
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
removeStatusBar()
statusBarColorChange()
}
override func viewDidLoad() {
super.viewDidLoad()
removeStatusBar()
statusBarColorChange()
}
if (@available(iOS 13, *))
{
UIView *statusBar = [[UIView alloc]initWithFrame:[UIApplication sharedApplication].keyWindow.windowScene.statusBarManager.statusBarFrame] ;
statusBar.backgroundColor = [UIColor redColor];
[[UIApplication sharedApplication].keyWindow addSubview:statusBar];
}
KeyWindow 在 iOS13 中已棄用。 您可以將此擴展用於swift 5和iOS 13 到頂部
extension UIApplication {
var statusBarUIView: UIView? {
if #available(iOS 13.0, *) {
let tag = 3848245
let keyWindow: UIWindow? = UIApplication.shared.windows.filter {$0.isKeyWindow}.first
if let statusBar = keyWindow?.viewWithTag(tag) {
return statusBar
} else {
let height = keyWindow?.windowScene?.statusBarManager?.statusBarFrame ?? .zero
let statusBarView = UIView(frame: height)
statusBarView.tag = tag
statusBarView.layer.zPosition = 999999
keyWindow?.addSubview(statusBarView)
return statusBarView
}
} else {
if responds(to: Selector(("statusBar"))) {
return value(forKey: "statusBar") as? UIView
}
}
return nil
}
}
並在AppDelegate類中的didFinishLaunchingWithOptions中使用它,例如:
UIApplication.shared.statusBarUIView?.backgroundColor = .red(any color)
你可以試試這個
if (@available(iOS 13, *))
{
UIView *_localStatusBar = [[UIApplication sharedApplication].keyWindow.windowScene.statusBarManager performSelector:@selector(createLocalStatusBar)];
statusBar = [_localStatusBar performSelector:@selector(statusBar)];
}
else
{
statusBar = [[UIApplication sharedApplication] valueForKey:@"statusBar"];
}
對於像我這樣仍在使用它的人來說,這是最受歡迎的答案的 ObjC 版本:
創建一個 UIApplication 類別並將其添加到您的項目中:
@implementation UIApplication (iOS13PorcoDiDio)
- (UIView*) statusBar
{
if([UIDevice getOSVersion] >= 13)
{
const NSUInteger k_TAG_STATUSBAR = 38482458385;
UIView * vStatusBar = [[UIApplication sharedApplication].keyWindow viewWithTag:k_TAG_STATUSBAR];
if(vStatusBar != nil)
return vStatusBar;
else {
UIView *vStatusBar = [[UIView alloc] initWithFrame:[UIApplication sharedApplication].statusBarFrame];
[vStatusBar setTag:k_TAG_STATUSBAR];
[[UIApplication sharedApplication].keyWindow addSubview:vStatusBar];
return vStatusBar;
}
} else if([UIApplication respondsToSelector:@selector(statusBar)])
return (UIView*)[UIApplication sharedApplication].statusBar;
else
return nil;
}
@end
Use this Extension:
extension UINavigationController {
func setStatusBar(backgroundColor: UIColor) {
let statusBarFrame: CGRect
if #available(iOS 13.0, *) {
statusBarFrame = view.window?.windowScene?.statusBarManager?.statusBarFrame ?? CGRect.zero
} else {
statusBarFrame = UIApplication.shared.statusBarFrame
}
let statusBarView = UIView(frame: statusBarFrame)
statusBarView.backgroundColor = backgroundColor
view.addSubview(statusBarView)
}}
我這樣做,可以得到狀態欄,但設置狀態欄背景顏色不起作用
UIView *statusBar;
if (@available(iOS 13, *)) {
UIView *_localStatusBar = [[UIApplication sharedApplication].keyWindow.windowScene.statusBarManager performSelector:@selector(createLocalStatusBar)];
statusBar = [_localStatusBar performSelector:@selector(statusBar)];
}
else {
statusBar = [[UIApplication sharedApplication] valueForKey:@"statusBar"];
}
if ([statusBar respondsToSelector:@selector(setBackgroundColor:)]) {
statusBar.backgroundColor = [UIColor redColor];
}
這是我見過的最好的答案..干杯
if #available(iOS 13.0, *) {
let app = UIApplication.shared
let statusBarHeight: CGFloat = app.statusBarFrame.size.height
let statusbarView = UIView()
statusbarView.backgroundColor = ColorPalette.grayChateau
view.addSubview(statusbarView)
statusbarView.translatesAutoresizingMaskIntoConstraints = false
statusbarView.heightAnchor
.constraint(equalToConstant: statusBarHeight).isActive = true
statusbarView.widthAnchor
.constraint(equalTo: view.widthAnchor, multiplier: 1.0).isActive = true
statusbarView.topAnchor
.constraint(equalTo: view.topAnchor).isActive = true
statusbarView.centerXAnchor
.constraint(equalTo: view.centerXAnchor).isActive = true
} else {
let statusBar = UIApplication.shared.value(forKeyPath: "statusBarWindow.statusBar") as? UIView
statusBar?.backgroundColor = UIColor.red
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.