Safari 视图控制器使用错误的状态栏颜色

Posted

技术标签:

【中文标题】Safari 视图控制器使用错误的状态栏颜色【英文标题】:Safari View Controller uses wrong status bar color 【发布时间】:2016-05-10 23:06:35 【问题描述】:

我的应用使用深色导航栏颜色。因此,我将状态栏颜色设置为白色(因此具有很好的对比度)。

我通过将 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 默认样式。所以状态栏基本不可见。

我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

您可以通过使用子类 UINavigationController 包装 SFSafariViewController 来实现。

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];

【讨论】:

迄今为止我找到的最佳答案和简单的方法,同时仍然支持已批准的 preferredStatusBarStyle 方法!【参考方案2】:

有两种方法可以覆盖 viewControllers 中的 preferredStatusBarStyle 并返回你想要的一种

- (UIStatusBarStyle)preferredStatusBarStyle

    return UIStatusBarStyleLightContent;


override func preferredStatusBarStyle() -> UIStatusBarStyle 
    return .Default

或者你可以手动设置

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

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

如何通过 sharedApplicaion 设置它,您需要将它添加到您的 plist “查看基于控制器的状态栏外观”为 NO

【讨论】:

感谢您的回复。我知道这一切。 为我自己的视图控制器设置状态栏样式效果很好。但是我不知道如何使Safari View Controller我们成为正确的状态栏样式。这是 Apple 课程,不受我的直接控制。 [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];不适合你?在通话之前添加它? 在调用 SVC 之前设置 UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.Default 不会改变任何东西。这是因为我使用 View Controller based status bar color 设置为 YES,因为我的应用程序需要它。我也不能为Safari View Controller 覆盖preferredStatusBarStyle,因为它不是我的班级。【参考方案3】:

如果你想为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:

preferredControlTintColor(工具栏项的颜色) preferredBarTintColor(工具栏颜色)

附:不要忘记使用CustomSFSafariViewController 而不是SFSafariViewController。你可以这样做。

let safariViewController = CustomSFSafariViewController(url: url)

【讨论】:

以上是关于Safari 视图控制器使用错误的状态栏颜色的主要内容,如果未能解决你的问题,请参考以下文章

如何为每个视图控制器分别更改状态栏颜色?

如何使用 swift 在一个视图控制器中更改状态栏颜色?

为不同的视图控制器设置状态栏颜色

是否可以更改所有视图控制器的状态栏颜色?

iOS 7:如何在一个视图控制器中将状态栏文本颜色更改为白色,在第二个视图控制器中更改为黑色?

没有 PWA 的 iOS Safari 状态栏主题颜色