Как изменить цвет фона строки состояния и текста на iOS 13?
С приходом iOS 13 статусбар в представлении больше не доступен через:
value(forKey: "statusBar") as? UIView
Из-за:
Завершение работы приложения из-за необработанного исключения "NSInternalInconsistencyException", причина: "Приложение вызвало окно -statusBar или -statusBar в UIApplication: этот код должен быть изменен, поскольку больше нет строки состояния или окна строки состояния. Вместо этого используйте объект statusBarManager на сцене окна. '
Но не ясно, как это должно использоваться для изменения цветов, поскольку keyWindow?.windowScene?.statusBarManager
кажется, не содержит ничего связанного с этим.
Я компилирую свой код с (iOS 10, *) совместимостью, поэтому я намерен продолжать использовать UIKit.
Есть идеи по этому поводу?
Ответы
Ответ 1
Вы можете добавить некоторые условия или использовать первое. Просто создайте расширение для 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
}
}
}
Ответ 2
ты можешь попробовать это
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"];
}
Ответ 3
if (@available(iOS 13, *))
{
UIView *statusBar = [[UIView alloc]initWithFrame:[UIApplication sharedApplication].keyWindow.windowScene.statusBarManager.statusBarFrame] ;
statusBar.backgroundColor = [UIColor redColor];
[[UIApplication sharedApplication].keyWindow addSubview:statusBar];
}
Ответ 4
Я сталкивался с этой проблемой раньше. В моем приложении произошел сбой при запуске этого кода с использованием 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)
}
Теперь моя проблема решена. Удачного кодирования.
Ответ 5
Я не уверен, почему вы хотите это сделать, потому что цвет основан на цвете представления, чем у вас, но этот код может помочь вам изменить цвет фона.
let keyData = Data(bytes: [0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x61,
0x72])
let key = String(data: keyData, encoding: String.Encoding.ascii)!
if let statusBar = UIApplication.shared.value(forKey: key) as? UIView {
statusBar.backgroundColor = UIColor.red
}
Ответ 6
Попробуй это:
if #available(iOS 13.0, *) {
return UIStatusBarManager.self as? UIView
} else {
// Fallback on earlier versions
return value(forKey: "statusBar") as? UIView
}
Ответ 7
for swift 5.0 I've done this to change background color,
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
UIApplication.shared.windows?.addSubview(statusBar)
} else {
UIApplication.shared.statusBarView?.backgroundColor = .white
UIApplication.shared.statusBarStyle = .lightContent
}
Ответ 8
Я делаю это, могу получить statusBar, но установить statusBar backgroundColor не работают
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];
}
Ответ 9
Это версия 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