15

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

带有白色状态栏的红色导航栏

我通过将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 视图控制器

我该如何解决?

4

3 回答 3

2

您可以通过使用子类 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];
于 2016-05-20T14:47:42.233 回答
0

如果要为 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(工具栏的颜色)

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

let safariViewController = CustomSFSafariViewController(url: url)
于 2021-03-12T13:47:24.567 回答
0

有两种方法可以覆盖您的 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 在此处输入图像描述

于 2016-02-02T08:58:14.010 回答