Objective c setStatusBarHidden在iOS 9.0中不推荐使用
我正在将我的代码从iOS 8升级到iOS 9。我的程序中有一个代码片段Objective c setStatusBarHidden在iOS 9.0中不推荐使用,objective-c,ios9,Objective C,Ios9,我正在将我的代码从iOS 8升级到iOS 9。我的程序中有一个代码片段 [[UIApplication applicationName]setStatusBarHidden:是] 我收到警告“setStatusBarHidden在iOS 9.0中不推荐使用,请使用-[UIViewController prefersStatusBarHidden”。如果我只是将“setStatusBarHidden”替换为“prefersStatusBarHidden”,我会得到“找不到实例方法”。 有人能告诉我
[[UIApplication applicationName]setStatusBarHidden:是]代码>
我收到警告“setStatusBarHidden在iOS 9.0中不推荐使用,请使用-[UIViewController prefersStatusBarHidden”。如果我只是将“setStatusBarHidden”替换为“prefersStatusBarHidden”,我会得到“找不到实例方法”。
有人能告诉我如何解决这个问题吗?您必须在ViewController.m中添加方法
- (BOOL)prefersStatusBarHidden {
return NO;
}
将以下代码添加到视图控制器
- (BOOL)prefersStatusBarHidden {
return NO;
}
注意:
- 如果更改此方法的返回值,请调用
setNeedssStatusBarAppearanceUpdate
方法
- 对于childViewController,指定子视图控制器
应控制首选状态栏隐藏/未隐藏状态,执行
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()
- 在UIViewController中隐藏/显示状态栏
.self.setStatusBar(隐藏:真/假)Swift 3.1 Xcode 8.2.1
在info.p中更改列出基于行视图控制器的状态栏外观,并将其设置为“否”
在目标设置中,勾选“隐藏状态栏”
这两个步骤都是必需的,带有Xcode 8.3.3的Swift 3
1) 在you Info.plist中添加一行。
2) 在ViewController ViewDidLoad()中,覆盖添加:
UIApplication.shared.isStatusBarHidden = true
可从iOS 7+获得
在UIViewController
类中使用此选项
var isHidden = true{
didSet{
self.setNeedsStatusBarAppearanceUpdate()
}
}
override var prefersStatusBarHidden: Bool {
return isHidden
}
如果更改此方法的返回值,请调用
setNeedsStatusBarAppearanceUpdate()方法。指定
视图控制器应控制隐藏/取消隐藏的首选状态栏
状态,实现childViewControllerForStatusBarHidden方法
prefersStatusBarHidden
是UIViewController对象的一种方法,而不是UIApplication。因此,您应该在每个UIViewController上设置它。@User196387谢谢。由于我是iOS编程新手,您能告诉我如何在每个UIViewController上设置它吗。“applicationName”是UIApplication类型。这是如何解决方案?preferStatusBarHidden在iOS 9之前就存在。它只能应用于视图控制器,因此如果您想更动态地隐藏或显示状态栏,在iOS 9中如何处理?例如,您将如何根据用户触摸屏幕上的按钮来显示或隐藏状态栏?@PolarBear您可以应用如下逻辑,-(void)touchesBegind:(NSSet*)接触事件:(UIEvent*)事件{shouldHideStatusBar=(shouldHideStatusBar)?否:是;[self-setNeedsStatusBarAppearanceUpdate];}您也可以将此代码添加到您的按钮事件中。@NileshPatel感谢您的帮助。我最终想出了如何用您的想法在我的根控制器上正确更改此代码。再次感谢。有一个提示,请确保添加到您的info.plist“查看基于控制器的状态栏外观”设置为“是”,否则一切似乎都不起作用。如何设置隐藏行为的动画?“isStatusBarHidden”也不赞成这样做。我接下来做的是在info.plist中添加一个名为“基于视图控制器的状态栏…”的属性,并使用布尔值“否”,在项目常规设置中,我将“状态栏类型”更改为“灯光”。