iOS 9.0 中不推荐使用 setStatusBarHidden

setStatusBarHidden is deprecated in iOS 9.0

我正在将我的代码从 iOS 8 升级到 iOS 9。我的程序中有一个代码片段 [[UIApplication applicationName] setStatusBarHidden:YES];.

我收到警告 "setStatusBarHidden is deprecated in iOS 9.0, Use -[UIViewController prefersStatusBarHidden"。如果我只是将 'setStatusBarHidden' 替换为 'prefersStatusBarHidden',我会得到 'instance method not found'。 有人可以建议我如何解决这个问题吗?

您必须在 yourViewController.m

中添加方法
- (BOOL)prefersStatusBarHidden {

   return NO;
}

将以下代码添加到您的视图控制器中。

 - (BOOL)prefersStatusBarHidden {

   return NO;
}

注:

  • 如果更改此方法的 return 值,请调用 setNeedsStatusBarAppearanceUpdate 方法。
  • 对于childViewController,指定一个子视图控制器 应该控制首选状态栏 hidden/unhidden 状态,实现 childViewControllerForStatusBarHidden 方法。

这是我的 swift 设置状态栏隐藏和样式的代码。

extension UIViewController {

public var privateStatusBarHidden: Bool {
    return statusBarHidden
}

public var privateStatusBarStyle: UIStatusBarStyle {
    return statusBarStyle
}

public func setStatusBarHidden(hidden: Bool, animated: Bool = false) {
    statusBarHidden = hidden
    if animated {
        UIView.animate(withDuration: 0.25, animations: { 
            self.setNeedsStatusBarAppearanceUpdate()
        })
    } else {
        self.setNeedsStatusBarAppearanceUpdate()
    }
}

public func setStatusBar(style: UIStatusBarStyle) {
    statusBarStyle = style
    self.setNeedsStatusBarAppearanceUpdate()
}

    public static func swizzleStatusBarHiddenPropertyForViewController() {
    var original = class_getInstanceMethod(UIViewController.self, #selector(getter: UIViewController.prefersStatusBarHidden))
    var changeling = class_getInstanceMethod(UIViewController.self, #selector(getter: UIViewController.privateStatusBarHidden))
    method_exchangeImplementations(original, changeling)
    original = class_getInstanceMethod(UIViewController.self, #selector(getter: UIViewController.preferredStatusBarStyle))
    changeling = class_getInstanceMethod(UIViewController.self, #selector(getter: UIViewController.privateStatusBarStyle))
    method_exchangeImplementations(original, changeling)

    original = class_getClassMethod(UIViewController.self, #selector(UIViewController.swizzleStatusBarHiddenPropertyForViewController))
    changeling = class_getClassMethod(UIViewController.self, #selector(UIViewController.emptyFunction))
    method_exchangeImplementations(original, changeling)
}

@objc private static func emptyFunction() {}
}

用法

  • 正在启动功能

UIViewController.swizzleStatusBarHiddenPropertyForViewController()

  • 用于 hide/show statusBar,在 UIViewController

。 self.setStatusBar(隐藏:true/false)

Swift 3.1 Xcode 8.2.1

  1. 更改info.plist行View controller-based status bar appearance并将其设置为NO

  2. 在您的目标设置中勾选 "Hide Status bar"

两个步骤都需要

Swift 3 与 Xcode 8.3.3

1) 加一行在你Info.plist。

2) 在您的 ViewController ViewDidLoad() 重写中添加:

 UIApplication.shared.isStatusBarHidden = true

prefersStatusBarHidden 可从 iOS 7+.

在您的 UIViewController class

中使用它
   var isHidden = true{
        didSet{
            self.setNeedsStatusBarAppearanceUpdate()
        }
    }
    override var prefersStatusBarHidden: Bool {
        return isHidden
    }

If you change the return value for this method, call the setNeedsStatusBarAppearanceUpdate() method. To specify that a child view controller should control preferred status bar hidden/unhidden state, implement the childViewControllerForStatusBarHidden method.