Как изменить цвет фона строки состояния и текста на iOS 13? - программирование
Подтвердить что ты не робот

Как изменить цвет фона строки состояния и текста на iOS 13?

С приходом iOS 13 статусбар в представлении больше не доступен через:

value(forKey: "statusBar") as? UIView

Из-за:

Завершение работы приложения из-за необработанного исключения "NSInternalInconsistencyException", причина: "Приложение вызвало окно -statusBar или -statusBar в UIApplication: этот код должен быть изменен, поскольку больше нет строки состояния или окна строки состояния. Вместо этого используйте объект statusBarManager на сцене окна. '

Но не ясно, как это должно использоваться для изменения цветов, поскольку keyWindow?.windowScene?.statusBarManager кажется, не содержит ничего связанного с этим.

Я компилирую свой код с (iOS 10, *) совместимостью, поэтому я намерен продолжать использовать UIKit.

Есть идеи по этому поводу?

4b9b3361

Ответ 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