【问题标题】:preferredStatusBarStyle var not working in iOS12?preferredStatusBarStyle var 在 iOS12 中不起作用?
【发布时间】:2020-06-11 23:53:27
【问题描述】:

添加

application.statusBarStyle = .lightContent

到我的 AppDelegate 的 didFinishLaunchingWithOptions 方法也不添加

override var preferredStatusBarStyle: UIStatusBarStyle {
    return UIStatusBarStyle.lightContent
}

to VC 不再适用于 iOS12/Xcode10

有什么想法吗?

【问题讨论】:

  • 在这里工作正常,当它应该工作时(即当你的视图控制器是顶级视图控制器时)。如果您需要实际帮助,您需要更全面地描述您的情况。
  • 感谢您的回复-在iPhone X上开发我正在尝试使状态栏区域更亮-例如,时间上的文本,蜂窝接收状态上的栏显示为黑色,并且我有一个深色主题的用户界面。我在顶级视图控制器中使用上述 VC 代码。我看到其他人的 cmets 说这在 iOS 12 中不起作用,但它似乎对你有用 - 我会重新检查。
  • 请注意,您的问题从未提及 iPhone X...嗯,让我测试一下这个特定的组合。你不在导航控制器中?
  • 是的,我在一个 uinavigationcontroller 中,vc 是堆栈中的第一个。
  • 你的问题也没有提到导航控制器。

标签: xcode10 ios12


【解决方案1】:

如果为每个 View Controller 选择相同的状态栏颜色:

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

将此添加到您的 Info.plist 并从 Project -> Targets -> Status Bar Style 按所需颜色设置状态栏颜色。

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

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

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

class LightContentNavigationController: UINavigationController {

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }
}

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

【讨论】:

  • 有人删除了我的评论!我把它放回去了:这解决了我的问题,非常感谢 - 我错过了我的 Plist 中的条目
  • 你真的救了我的命。非常感谢
  • 这是完美的答案。非常感谢!重点是继承 UINavigationController 而不是添加它的扩展。
【解决方案2】:

这与 iOS 12 无关。您只是规则错误。

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

令人惊讶的是,它是由导航栏的barStyle 决定的。要获得浅色状态栏文本,请说(在您的视图控制器中):

self.navigationController?.navigationBar.barStyle = .black

难以置信,但却是真实的。几年前,我直接从 Apple 获得了这些信息。

您也可以在情节提要中执行此设置。

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

导航栏的栏样式为.black:

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

【讨论】:

  • Matt,感谢您的回复和插图,非常有帮助!
  • 对,但我的意思是这样做(正确的方式)比将 UIViewControllerBasedStatusBarAppearance 设置为 false 要好得多。
  • 非常好的洞察力,我总是采用公认的答案方法,这真的很痛苦。我知道 UINavigationController 是有罪的,但我只是没有停下来弄清楚究竟是为什么。感谢@matt 的信息,很遗憾Apple simple 没有在任何地方提及它——或者至少在其文档中没有明确提及。状态栏如此简单,却又如此晦涩。
  • 谢谢 - 这太奇怪了,感谢这个答案,肯定节省了很多时间。
  • 谢谢!下午节省
【解决方案3】:

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

viewController = modalPresentationCapturesStatusBarAppearance = true

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

      简答:

      1. 使用UIModalPresentationStyle.fullScreen呈现模态
      2. 覆盖preferredStatusBarStyle(在您的模态vc中)
      3. viewWillAppear 中调用setNeedsStatusBarAppearanceUpdate()(在您的模态vc 中)

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

      根据苹果文档:

      当您通过调用 present(_:animated:completion:)方法,状态栏出现 控制从呈现转移到呈现的视图 控制器仅当呈现控制器的 modalPresentationStyle 值为 UIModalPresentationStyle.fullScreen。通过设置此属性 为 true,您指定呈现的视图控制器控件状态栏 外观,即使呈现非全屏。

      系统会忽略视图控制器的此属性值 全屏显示。

      【讨论】:

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