preferredStatusBarStyle var 在 iOS12 中不起作用?

preferredStatusBarStyle var not working in iOS12?

添加

application.statusBarStyle = .lightContent

向我的 AppDelegate didFinishLaunchingWithOptions 方法添加

override var preferredStatusBarStyle: UIStatusBarStyle {
    return UIStatusBarStyle.lightContent
}

到 VC 不再适用于 iOS12/Xcode10

有什么想法吗?

如果您为每个视图控制器选择相同的状态栏颜色:

<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>

将此添加到您的 Info.plist 并从项目 -> 目标 -> 状态栏样式中按所需颜色设置状态栏颜色。

另一方面,在您的情况下,您有一个嵌入在视图控制器中的导航控制器。因此,您想为每个页面设置不同的状态栏颜色。

<key>UIViewControllerBasedStatusBarAppearance</key>
<true/>

将此广告添加到您的 Info.plist。然后,为您的 NavigationController 创建自定义 class。之后就可以实现方法了:

class LightContentNavigationController: UINavigationController {

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }
}

就是这样!请告诉我这是否有用!

这与iOS无关 12.你只是把规则弄错了。

在导航控制器的情况下,状态栏的颜色不是由视图控制器的 preferredStatusBarStyle 决定的。

竟然是由导航栏的barStyle决定的。要获取灯光状态栏文本,请说(在您的视图控制器中):

self.navigationController?.navigationBar.barStyle = .black

难以置信,但确实如此。几年前,我直接从 Apple 那里获得了这些信息。

您也可以在故事板中进行此设置。

例子!导航栏的栏样式为.default:

导航栏的栏样式为.black:

iOS13注意事项只要您不使用大标题或 UIBarAppearance,这在 iOS13 中仍然有效。但基本上你应该停止这样做,让状态栏颜色根据用户选择的浅色或深色模式自动显示。

如果 Matt 的回答不适合您,请尝试在展示您的 viewController 之前添加这行代码。

viewController = modalPresentationCapturesStatusBarAppearance = true

我遇到一个错误,将 modalPresentationStyle 设置为 overFullScreen 不会将状态栏控件提供给呈现的视图控制器或导航控制器。

我正在为 UITabBarController 的每个选项卡使用导航控制器。子类化 UINavigationController 并覆盖 childForStatusBarStyle 为我解决了这个问题。

class MyNavigationController: UINavigationController {
    open override var childForStatusBarStyle: UIViewController? {
        return topViewController?.childForStatusBarStyle ?? topViewController
    }
}

如果你有一个模态 UIViewController,情况就会变得非常棘手。

简答:

  1. 当前模式使用 UIModalPresentationStyle.fullScreen
  2. 覆盖 preferredStatusBarStyle(在你的模态中 vc)
  3. viewWillAppear 中调用 setNeedsStatusBarAppearanceUpdate()(在你的模式 vc 中)

如果你不想使用 UIModalPresentationStyle.fullScreen 你必须设置 modalPresentationCapturesStatusBarAppearance

根据苹果文档:

When you present a view controller by calling the present(_:animated:completion:) method, status bar appearance control is transferred from the presenting to the presented view controller only if the presented controller's modalPresentationStyle value is UIModalPresentationStyle.fullScreen. By setting this property to true, you specify the presented view controller controls status bar appearance, even though presented non-fullscreen.

The system ignores this property’s value for a view controller presented fullscreen.

可以设置

vc.modalPresentationCapturesStatusBarAppearance = true

使自定义生效。

自定义 UINavigationController 可以解决问题

class ChangeableStatusBarNavigationController: UINavigationController {

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return topViewController?.preferredStatusBarStyle ?? .default
    }
}

参考:https://serialcoder.dev/text-tutorials/ios-tutorials/change-status-bar-style-in-navigation-controller-based-apps/