Safari View Controller使用错误的状态栏颜色

时间:2016-02-02 08:34:28

标签: ios colors uinavigationbar statusbar sfsafariviewcontroller

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

red navigation bar with white status bar

我是通过将 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 view controller with white status bar color

我该如何解决?

3 个答案:

答案 0 :(得分: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];

答案 1 :(得分: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中 &#34;查看基于控制器的状态栏外观&#34;没有 enter image description here

答案 2 :(得分: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(工具栏的颜色)

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

let safariViewController = CustomSFSafariViewController(url: url)