【问题标题】:Setting statusbarStyle (deprecated in iOS 9.0)设置 statusbarStyle(在 iOS 9.0 中已弃用)
【发布时间】:2018-06-05 06:42:42
【问题描述】:

刚刚下载了新的 xCode 10.0,发现旧的 statusBarStyle 自 iOS 9.0 以来已被弃用。

警告: Setter for 'statusBarStyle' was deprecated in iOS 9.0: Use -[UIViewController preferredStatusBarStyle]

已弃用的代码: UIApplication.shared.statusBarStyle = .default

我尝试使用self.preferredStatusBarStyle,但发现该属性只是一个吸气剂。那么有人知道如何设置statusBarStyle吗?


编辑

我想更改函数内的 statusBarStyle,用户可以在其中切换不同的主题。例如:

func changeStatusBar(toDarkMode: Bool) {
    if toDarkMode {
        // Set to light statusBarStyle
    } else { 
        // Set to default
    }
}

【问题讨论】:

标签: ios swift xcode


【解决方案1】:

Info.plist中添加View controller-based status bar appearance NO

并在 Deployment Info 中的状态栏样式中选择 Light

【讨论】:

  • 这就是您第一次设置的方式。如果您想在应用程序运行期间在暗和亮之间切换。这就是问题
  • 但这就是我设法设置它的方式,因为其他解决方案不适合我
  • 不,这不是唯一的方法。向上滚动到@MdRashedPervez 答案,您将看到另一种方法如何更改不同视图控制器的状态栏。
  • @JacobAhlberg 不知道为什么,但这是我使状态栏变浅的唯一方法。我尝试了 MdRashedPervez 解决方案,但它对我不起作用
  • 我刚刚尝试了@CryingHippos 的答案,它运行顺利。我不得不使用UINavigationController 的扩展名并返回我想要的样式。看看吧!
【解决方案2】:

使用您现在拥有的相同代码设置您的 darkMode 变量,然后在系统期望的计算变量中使用它:

var darkMode = false
override var preferredStatusBarStyle : UIStatusBarStyle {
    return darkMode ? .default : .lightContent
}

根据上下文,您可能需要强制刷新屏幕才能使其生效。您可以通过以下调用来做到这一点:

setNeedsStatusBarAppearanceUpdate()

【讨论】:

  • 看起来不错,但是即使我使用这行代码,statusBarStyle 也没有得到更新。我在 darkMode 布尔值中使用了 didSet 闭包,它更新了 statusBarAppearance。每当我更改布尔值时都会调用它。但是 statusBarStyle 不会改变。你知道它可能是什么吗?
  • 你是在根视图控制器中设置这个吗?请参阅 Apple 文档中的讨论:developer.apple.com/documentation/uikit/uiviewcontroller/…
  • @paulking 我使用的是相同的,但在 iPHOne XS、XR 和 XS 中,默认启动(启动)屏幕不显示状态栏的轻量内容。
  • @BalKrishanYadav,启动/启动屏幕不执行任何代码,因此在这种情况下,您需要在 General/Deployment Info 下为应用程序目标设置“状态栏样式”。
  • @paulking 建议在 rootviewcontroller 中设置它就可以了。
【解决方案3】:

swift4中,您可以在ViewControllerviewDidLoad()下方使用这段代码-

override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent
}

【讨论】:

  • 我实际上是在两个不同的主题(浅色和深色)之间切换,所以我必须更改函数内的 statusBarStyle。你有什么线索吗?
  • 在你的函数中为这两个不同的主题设置一个标签。例如。对于 theme1 设置 tag1 然后如果它获得标签 1 那么它将显示状态栏灯。其他人也一样。
  • 我实际上使用了一个位于 statusBar 后面的 mapView,每当用户将 mapType 从默认更改为卫星时,我都必须更改 statusBar,这样它就不会融入到 mapView 中。所以我真的不能在上面设置标签......还有其他建议吗?
  • @Md Rashed Pervez 我从上面添加了您的代码,但似乎没有什么不同。
  • @icekomo 您是否将代码放在 ViewController 中的 viewDidLoad() 下方
【解决方案4】:

如果您使用 UINavigationController,您可能还需要使用以下代码:

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

原因是setNeedsStatusBarAppearanceUpdate() 不叫孩子preferredStatusBarStyle

【讨论】:

  • 如果我使用编辑器菜单下的嵌入导航控制器,我会把它放在哪里?
【解决方案5】:

其他建议都不适合我。我最终通过以下方式让它工作:

  1. 设置:

    override var preferredStatusBarStyle : UIStatusBarStyle {
        return .lightContent
    }
    
  2. 调用:

    setNeedsStatusBarAppearanceUpdate()
    

【讨论】:

    【解决方案6】:

    我的解决方案是这样的: 从导航控制器进行扩展:

    extension UINavigationController {
        open override var preferredStatusBarStyle: UIStatusBarStyle {
            if let topViewController = presentedViewController{
                return topViewController.preferredStatusBarStyle
            }
            if let topViewController = viewControllers.last {
                return topViewController.preferredStatusBarStyle
            }
    
            return .default
        }
    }
    

    如果你有一个 viewController 的风格不同于应用的风格,你可以这样做

    var barStyle = UIStatusBarStyle.lightContent
    override var preferredStatusBarStyle: UIStatusBarStyle{
        return barStyle
    }
    

    假设您的应用状态样式为.default,并且您希望此屏幕为.lightContent 所以 barStyle 会将 .lightContent 作为默认值,这会将状态栏样式更改为 lightContent,然后确保当 viewWillDisappear 再次将 barStyle 更改为应用程序状态栏样式,在我们的例子中是 .default

    这对我有用

    【讨论】:

    • 不要试图覆盖扩展中的方法。这是未定义的行为,the documentation 声明您不应该这样做。
    猜你喜欢
    • 1970-01-01
    • 2015-09-15
    • 2016-01-14
    • 1970-01-01
    • 1970-01-01
    • 2021-01-31
    • 1970-01-01
    • 2016-01-25
    • 1970-01-01
    相关资源
    最近更新 更多