Safari View Controller использует неправильный цвет строки состояния

В моем приложении панель навигации темного цвета. Поэтому я установил цвет строки состояния на белый (чтобы он имел хороший контраст).

красная панель навигации с белой строкой состояния

Я сделал это, установив для barStyle черный цвет (чтобы строка состояния стала белой), а также установив для barTint темно-красный цвет. Прекрасно работает.

Я представляю SafariViewController вот так:

func openWebsite(urlString: String) {
    if let url = NSURL(string: urlString) {
        let svc = SFSafariViewController(URL: url)
        svc.delegate = self
        self.presentViewController(svc, animated: true, completion: nil)
    }
}

Однако строка состояния представленного SafariViewController по-прежнему белая. Это проблема, потому что SVC панель навигации имеет белый прозрачный стиль по умолчанию iOS по умолчанию. Таким образом, строка состояния практически невидима.

контроллер представления Safari с белым цветом строки состояния

Как я могу это исправить?


person funkenstrahlen    schedule 02.02.2016    source источник


Ответы (3)


Вы можете добиться этого, заключив SFSafariViewController в подкласс UINavigationController.

BlackStatusBarNavigationController.h

@interface BlackStatusBarNavigationController : UINavigationController
@end

BlackStatusBarNavigationController.h

@interface BlackStatusBarNavigationController ()

@end

@implementation BlackStatusBarNavigationController

- (UIStatusBarStyle)preferredStatusBarStyle {
    return UIStatusBarStyleDefault;
}

@end

Использовать так:

UINavigationController *navigationController = [[BlackStatusBarNavigationController alloc] initWithRootViewController:viewController];
navigationController.navigationBarHidden = YES;

[self presentViewController:navigationController animated:YES completion:nil];
person konradholub    schedule 20.05.2016
comment
Лучший и легкий ответ, который я нашел до сих пор, при этом все еще поддерживая одобренный метод primaryStatusBarStyle! - person Bob de Graaf; 06.12.2016

Есть 2 способа переопределить предпочтительныйStatusBarStyle в ваших viewControllers и вернуть тот, который вам нужен.

- (UIStatusBarStyle)preferredStatusBarStyle
{
    return UIStatusBarStyleLightContent;
}

override func preferredStatusBarStyle() -> UIStatusBarStyle {
    return .Default
}

или вы можете установить его вручную с помощью

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

UIApplication.sharedApplication().setStatusBarHidden(false, withAnimation: UIStatusBarAnimation.None)

однако для настройки его через sharedApplicaion вам нужно будет добавить это в свой plist «Просмотр внешнего вида строки состояния на основе контроллера» на NO введите описание изображения здесь

person David Yang Liu    schedule 02.02.2016
comment
Благодарю за ваш ответ. Я все это знаю. Установка стиля строки состояния для моего собственного контроллера представления работает отлично. Однако я не знаю, как сделать Safari View Controller нам правильный стиль строки состояния. Это класс Apple, не находящийся под моим непосредственным контролем. - person funkenstrahlen; 02.02.2016
comment
[[UIApplication sharedApplication] setStatusBarStyle: UIStatusBarStyleLightContent]; у вас не работает? добавляя перед звонком? - person David Yang Liu; 02.02.2016
comment
Установка UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.Default прямо перед вызовом SVC ничего не меняет. Это потому, что я использую View Controller based status bar color со значением YES, потому что это требуется моему приложению. Я также не могу переопределить preferredStatusBarStyle для Safari View Controller, поскольку это не мой класс. - person funkenstrahlen; 02.02.2016

Если вы хотите установить цвет фона строки состояния для iOS 13+, вы можете попробовать установить его принудительно, как это.

import UIKit
import SafariServices

class CustomSFSafariViewController: SFSafariViewController {
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(true)

        if #available(iOS 13.0, *) {
            UIApplication.shared.statusBarView?.backgroundColor = .purple
        }

        setNeedsStatusBarAppearanceUpdate()
    }
}


extension UIApplication {
    @available(iOS 13.0, *)
    var statusBarView: UIView? {
        let tag = 3848245
        
        let keyWindow = 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
        }
    }
}

Есть несколько полезных свойств для настройки SFSafariViewController, которые вы можете использовать:

  • предпочтительныйControlTintColor (цвет элементов панели инструментов)
  • предпочтительныйBarTintColor (цвет панели инструментов)

P.S. не забудьте использовать CustomSFSafariViewController вместо SFSafariViewController. Вы можете сделать это вот так.

let safariViewController = CustomSFSafariViewController(url: url)
person Zhebzhik Babich    schedule 12.03.2021