prefersStatusBarHidden 未调用
prefersStatusBarHidden not called
我有一个 UITabViewController
-> UINavigationController
-> UIViewController
并且想要隐藏和取消隐藏状态栏。当我调用 setNeedsStatusBarAppearanceUpdate()
时,方法 prefersStatusBarHidden
没有被调用。
func fadeOutStatusBar (notification: NSNotification) {
statusBarHidden = true
self.setNeedsStatusBarAppearanceUpdate()
}
func fadeInStatusBar (notification: NSNotification) {
statusBarHidden = false
self.setNeedsStatusBarAppearanceUpdate()
}
override func prefersStatusBarHidden() -> Bool {
return statusBarHidden
}
想通了。在 info.plist 文件中:
视图控制器-状态栏外观应设置为 YES
首先,.plist
文件中的View controller-based status bar appearance
必须设置为YES.
- 如果你想在整个应用程序中隐藏状态栏:
对于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
}
对于 swift 3,首先,确保 View controller-based status bar appearance
在您的 Info
plist 文件
中设置为 YES
然后将其添加到您的视图控制器中:
override var prefersStatusBarHidden: Bool {
get {
return true
}
}
我希望这对以后的人有所帮助。
也许不是 OP 问题的解决方案,但如果您在应用程序委托中使用了第二个 window,也可能是 prefersStatusBarHidden
未被调用的原因,例如用于显示启动画面,并且您在显示启动画面后没有隐藏它 - 然后 window 获取导致调用这些函数的事件。
当我们嵌套 UINavigationController 时,我们的
AppDelegate。 Window。 RootViewController
通常我们创建navigationController的时候首先会在navigationController中调用childViewControllerForStatusBarHidden函数,因为默认returns nil,然后调用navigationControllerprefersStatusBarHidden函数本身,所以我们在viewController中通过prefersStatusBarHidden函数设置的状态栏不会被调用,所以不会起作用。
所以我们要创建我们自己的继承自 NavigationController,在这个子类 ChildViewControllerForStatusBarHidden 函数中。
如果您使用 UINavigationController
作为 AppDelegate
中的 window.rootViewController
,那么您可能需要扩展 UINavigationController
以调用其 topViewController
的prefersStatusBarHidden
:
class YourNavigationController: UINavigationController {
override var childForStatusBarHidden: UIViewController? {
return topViewController
}
}
对于Swift4.2iOS12
假设您有一个 ViewController
包含在 UINavigationController
中。创建您自己的 UINavigationController
子类并在其中包含:
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
确保info.plist
设置View Controller
基于状态栏的设置
如果您有其他 window
未隐藏,则不会调用该方法。隐藏其他window即可,如你所愿
属性 prefersStatusBarHidden
正在当前视图控制器的根视图控制器上调用。
这意味着,如果您的应用基于 UISplitViewController
,您必须在自定义 UISplitViewController
class.[=13= 中实施 属性 ]
您只需要隐藏导航控制器,statusBar
也会隐藏。
试试这个 viewDidLoad
例子
override func viewDidLoad() {
super.viewDidLoad()
navigationController?.setNavigationBarHidden(false, animated: false)
}
我有一个 UITabViewController
-> UINavigationController
-> UIViewController
并且想要隐藏和取消隐藏状态栏。当我调用 setNeedsStatusBarAppearanceUpdate()
时,方法 prefersStatusBarHidden
没有被调用。
func fadeOutStatusBar (notification: NSNotification) {
statusBarHidden = true
self.setNeedsStatusBarAppearanceUpdate()
}
func fadeInStatusBar (notification: NSNotification) {
statusBarHidden = false
self.setNeedsStatusBarAppearanceUpdate()
}
override func prefersStatusBarHidden() -> Bool {
return statusBarHidden
}
想通了。在 info.plist 文件中: 视图控制器-状态栏外观应设置为 YES
首先,.plist
文件中的View controller-based status bar appearance
必须设置为YES.
- 如果你想在整个应用程序中隐藏状态栏:
对于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
}
对于 swift 3,首先,确保 View controller-based status bar appearance
在您的 Info
plist 文件
YES
然后将其添加到您的视图控制器中:
override var prefersStatusBarHidden: Bool {
get {
return true
}
}
我希望这对以后的人有所帮助。
也许不是 OP 问题的解决方案,但如果您在应用程序委托中使用了第二个 window,也可能是 prefersStatusBarHidden
未被调用的原因,例如用于显示启动画面,并且您在显示启动画面后没有隐藏它 - 然后 window 获取导致调用这些函数的事件。
当我们嵌套 UINavigationController 时,我们的 AppDelegate。 Window。 RootViewController 通常我们创建navigationController的时候首先会在navigationController中调用childViewControllerForStatusBarHidden函数,因为默认returns nil,然后调用navigationControllerprefersStatusBarHidden函数本身,所以我们在viewController中通过prefersStatusBarHidden函数设置的状态栏不会被调用,所以不会起作用。 所以我们要创建我们自己的继承自 NavigationController,在这个子类 ChildViewControllerForStatusBarHidden 函数中。
如果您使用 UINavigationController
作为 AppDelegate
中的 window.rootViewController
,那么您可能需要扩展 UINavigationController
以调用其 topViewController
的prefersStatusBarHidden
:
class YourNavigationController: UINavigationController {
override var childForStatusBarHidden: UIViewController? {
return topViewController
}
}
对于Swift4.2iOS12
假设您有一个 ViewController
包含在 UINavigationController
中。创建您自己的 UINavigationController
子类并在其中包含:
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
确保info.plist
设置View Controller
基于状态栏的设置
如果您有其他 window
未隐藏,则不会调用该方法。隐藏其他window即可,如你所愿
属性 prefersStatusBarHidden
正在当前视图控制器的根视图控制器上调用。
这意味着,如果您的应用基于 UISplitViewController
,您必须在自定义 UISplitViewController
class.[=13= 中实施 属性 ]
您只需要隐藏导航控制器,statusBar
也会隐藏。
试试这个 viewDidLoad
例子
override func viewDidLoad() {
super.viewDidLoad()
navigationController?.setNavigationBarHidden(false, animated: false)
}