【问题标题】:Safari View Controller uses wrong status bar colorSafari 视图控制器使用错误的状态栏颜色
【发布时间】: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 默认样式。所以状态栏基本不可见。

我该如何解决这个问题?

【问题讨论】:

    标签: ios colors uinavigationbar statusbar sfsafariviewcontroller


    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 2014-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-08
      • 2016-05-05
      • 2018-05-24
      相关资源
      最近更新 更多