我有UITabViewController
- > UINavigationController
- > UIViewController
并希望隐藏和取消隐藏statusBar。当我致电setNeedsStatusBarAppearanceUpdate()
时,方法prefersStatusBarHidden
未被调用。
func fadeOutStatusBar (notification: NSNotification) {
statusBarHidden = true
self.setNeedsStatusBarAppearanceUpdate()
}
func fadeInStatusBar (notification: NSNotification) {
statusBarHidden = false
self.setNeedsStatusBarAppearanceUpdate()
}
override func prefersStatusBarHidden() -> Bool {
return statusBarHidden
}
答案 0 :(得分:37)
首先,View controller-based status bar appearance
文件中的.plist
必须设置为是。
对于Objective-C:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[application setStatusBarHidden:YES];
return YES;
}
对于Swift:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject:AnyObject]?) -> Bool {
application.statusBarHidden = true
return true
}
.m
文件中执行:对于Objective-C:
- (BOOL)prefersStatusBarHidden {
return YES;
}
对于Swift:
override func prefersStatusBarHidden() -> Bool {
return true
}
答案 1 :(得分:19)
想出来。在info.plist文件中: 视图控制器状态栏外观应设置为YES
答案 2 :(得分:14)
对于swift 3,首先请确保View controller-based status bar appearance
plist文件中的YES
设置为Info
然后将其添加到您的视图控制器:
override var prefersStatusBarHidden: Bool {
get {
return true
}
}
我希望这有助于将来的人们。
答案 3 :(得分:9)
也许不是OP问题的解决方案,但是如果您在应用代理中使用了第二个窗口,例如用于显示启动画面,那么prefersStatusBarHidden
未被调用的原因也可能是什么?在显示启动后没有隐藏它 - 然后该窗口获取导致调用这些函数的事件。
答案 4 :(得分:1)
如果没有隐藏其他window
,则不会调用该方法。只需隐藏其他窗口,它就会按照您的意愿工作
答案 5 :(得分:0)
当我们嵌套 UINavigationController 时, AppDelegate。窗口。 RootViewController 通常我们会在第一次调用navigationController childViewControllerForStatusBarHidden 函数时创建navigationController,因为默认值返回nil,然后将其称为navigationController prefersStatusBarHidden 函数本身,因此我们在其中设置状态栏通过 prefersStatusBarHidden 函数的viewController将不会被调用,因此它将无法工作。 因此,我们将在此子类 ChildViewControllerForStatusBarHidden 函数中创建一个继承自 NavigationController 的函数。
答案 6 :(得分:0)
您可以编写UINavigationController的扩展,以覆盖其默认实现并返回顶部的ViewController。
extension UINavigationController {
override public func childViewControllerForStatusBarHidden() -> UIViewController{
return self.topViewController
}
}
答案 7 :(得分:0)
对于Swift 4.2 iOS 12
假设您有一个ViewController
中包含一个UINavigationController
。创建自己的UINavigationController
子类,并将其包含在其中:
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
确保info.plist
设置基于View Controller
的状态栏设置
答案 8 :(得分:0)
属性prefersStatusBarHidden
。
这意味着,例如,如果您的应用基于UISplitViewController
,则必须在自定义UISplitViewController
类中实现该属性。
答案 9 :(得分:0)
您只需要隐藏导航控制器,statusBar
也将隐藏。
试试这个 viewDidLoad
示例
override func viewDidLoad() {
super.viewDidLoad()
navigationController?.setNavigationBarHidden(false, animated: false)
}