当前位置: 首页 > 知识库问答 >
问题:

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

胡弘毅
2023-03-14

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

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

我怎样才能解决这个问题?

共有3个答案

司徒斌
2023-03-14

如果你想为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(工具栏项目的颜色)
  • PreferredBartinColor(工具栏的颜色)

P. S.不要忘记使用CustomSFSafariViewController而不是SFSafariViewController。您可以这样做。

let safariViewController = CustomSFSafariViewController(url: url)
文彭祖
2023-03-14

有两种方法可以替代ViewController中的preferredStatusBarStyle并返回所需的样式

- (UIStatusBarStyle)preferredStatusBarStyle
{
    return UIStatusBarStyleLightContent;
}

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

或者,您可以使用手动设置

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

UIApplication.sharedApplication().setStatusBarHidden(false, withAnimation: UIStatusBarAnimation.None)
许琛
2023-03-14

您可以通过将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];
 类似资料:
  • 我有一个应用程序,基于视图控制器的状态栏外观设置为。我的一些视图是深色的,一些视图是浅色的,应用程序有一个相当复杂的视图控制器层次结构,但它可以完美地将适当的方法子类化和重写,并与模式视图(捕捉呈现样式等)相结合。 然而,我需要一种全局的方式来查看顶部的特定项目(在状态栏后面,在我的应用程序边界内),就像顶部的个人热点/GarageBand录音/通话等栏一样。由于栏的背景颜色,我想在显示栏时覆盖状

  • 我有一个视图控制器,这是导航控制器的rootVc。 我需要为rootview控制器隐藏导航栏,因此我使用以下方法来隐藏它并使其重新出现。 我基本上是在rootVc中隐藏导航栏,并为所有其他视图控制器显示它。 但当我移除导航栏时,我看到我的内容正在状态栏下扩展 有办法解决这个问题吗?

  • 标题说明了一切。或者我在理解sdk时有一些非常错误的地方,或者苹果的sdk有一些非常错误的地方。 设置(info.plist)基于视图控制器的状态时..=是的,我可以通过调用setNeedsStatusBarEtc来隐藏我的状态栏动画等等。。。但是,我不能改变我喜欢的风格。当我将其设置为“否”时,我可以更改样式,但不能更改所有其他内容。。我该怎么办?怎么了?请帮帮我! 当基于控制器的状态...=Y

  • 我的项目中有多个故事板。我在一个故事板中有一个主页面浏览量控制器,我在一个单独的故事板中有一个安装视图控制器嵌入导航控制器。现在,当我从主页视图控制器中显示安装视图控制器导航控制器时,状态栏不会隐藏。但是当我将安装视图控制器故事板设置为info.plist中的主故事板文件库,并且安装视图控制器导航控制器是第一个呈现的视图时,状态栏将隐藏。我正在使用下面的代码隐藏状态栏。有人能告诉我当状态视图控制器

  • 还有黑色的图标,可能吗? 谢谢 编辑: M 开发人员预览版中的新增功能:windowLightStatusBar。在主题中打开它会告诉系统使用深色前景,这对于浅色状态栏很有用。请注意,M 预览似乎有一个错误,其中通知图标保持白色,而系统状态图标正确更改为半透明黑色。

  • 我有一个问题,当它涉及到状态栏和隐藏它。 我有一个具有幻灯片菜单的BaseViewController。这个BaseViewController也是应用程序[的根控制器,设置在应用程序中]: 只要我选择一个菜单项,BaseViewController就会被相应的ViewController填充[在我将其嵌入导航控制器之后]。 菜单项A:ViewControllerA 菜单项B: ViewContr