[英]How do I hide the status bar in a Swift iOS app?
我想删除屏幕顶部的状态栏。
这不起作用:
func application
(application: UIApplication,
didFinishLaunchingWithOptions launchOptions: NSDictionary?)
-> Bool
{
application.statusBarHidden = true
return true
}
我也试过:
func application
(application: UIApplication,
didFinishLaunchingWithOptions launchOptions: NSDictionary?)
-> Bool
{
self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
var controller = UIViewController()
application.statusBarHidden = true
controller.setNeedsStatusBarAppearanceUpdate()
var view = UIView(frame: CGRectMake(0, 0, 320, 568))
view.backgroundColor = UIColor.redColor()
controller.view = view
var label = UILabel(frame: CGRectMake(0, 0, 200, 21))
label.center = CGPointMake(160, 284)
label.textAlignment = NSTextAlignment.Center
label.text = "Hello World"
controller.view.addSubview(label)
self.window!.rootViewController = controller
self.window!.makeKeyAndVisible()
return true
}
你真的应该在你的视图控制器上实现 prefersStatusBarHidden:
Swift 3 及更高版本
override var prefersStatusBarHidden: Bool {
return true
}
在方法内添加代码
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject:AnyObject]?) -> Bool { application.statusBarHidden = true return true }
完毕! 运行您的应用程序,不再有状态栏!
斯威夫特 3
在Info.plist
将View controller-based status bar appearance
为NO
并调用UIApplication.shared.isStatusBarHidden = true
如果您想在按钮点击时隐藏和恢复状态栏,而在呈现和关闭滑入菜单、弹出窗口等时,则可以使用此方法:-
隐藏状态栏:-
UIApplication.shared.keyWindow?.windowLevel = UIWindowLevelStatusBar
要恢复状态栏:-
UIApplication.shared.keyWindow?.windowLevel = UIWindowLevelNormal
iOS 10 / Swift 3.0 更新
不再是一个函数,现在是一个属性......
override var prefersStatusBarHidden: Bool {
return true
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(true);
navigationController?.navigationBar.hidden = true // for navigation bar hide
UIApplication.sharedApplication().statusBarHidden=true; // for status bar hide
}
在 Swift 3.x 中:
override func viewWillAppear(_ animated: Bool) {
UIApplication.shared.isStatusBarHidden = true
}
所以这里的问题实际上与 Swift 无关,而是从 iOS 7 开始如何处理状态栏外观。
默认情况下,视图控制器单独控制状态栏在屏幕上的外观。 如果你想使用这种控制状态栏的方法,你可以为你想要修改外观的任何视图控制器覆盖以下方法:
prefersStatusBarHidden
、 preferredStatusBarStyle
、 preferredStatusBarAnimation
、
在您的情况下,您只需实现prefersStatusBarHidden
并返回true
。
另一种方法是在应用程序级别控制状态栏外观。 这似乎是你真正想要做的(通过设置application.statusBarHidden
)。
为了让这个工作,你需要打开你的应用程序的Info.plist
文件并添加键UIViewControllerBasedStatusBarAppearance
,并给它一个值NO
。
就我而言,我需要根据某些条件更新隐藏的状态栏。
因此,我创建了一个包含新属性hideStatusBar
的基本控制器BaseViewController
。
其他视图控制器是这个基本控制器的子类。 最后,当我想更新状态栏行为时,我只需要更改此hideStatusBar
值。
class BaseViewController: UIViewController {
var hideStatusBar: Bool = false {
didSet {
setNeedsStatusBarAppearanceUpdate()
}
}
override var prefersStatusBarHidden: Bool {
return hideStatusBar
}
}
final class ViewController: BaseViewController, UIScrollViewDelegate {
let scrollView = UIScrollView()
...
func scrollViewDidScroll(_ scrollView: UIScrollView) {
UIView.animate(withDuration: 0.3) {
if scrollView.contentOffset.y > 100 {
self.hideStatusBar = true
} else {
self.hideStatusBar = false
}
}
}
}
这是一个演示,我使用UIView.animate(...)
使过渡更平滑。
其实我自己想通了。 我将添加我的解决方案作为另一种选择。
extension UIViewController {
func prefersStatusBarHidden() -> Bool {
return true
}
}
好的,所以这对我来说成了一个问题,因为 iOS 9 不支持人们在这里提到的任何上述方法,例如UIApplication.sharedApplication().statusBarHidden = true
或
UIApplication.sharedApplication().setStatusBarHidden(true, withAnimation: UIStatusBarAnimation.None)
和
override func prefersStatusBarHidden() -> Bool {
return true
}
有效,但不提供我可以根据条件进行更改的可编程解决方案。 ( statusBarHidden = true
和statusBarHidden = false
正如我们之前所做的那样)。
解决这个疯狂的方法:
通过像下面这样添加到prefersStatusBarHidden()
,您可以以编程方式控制状态栏的隐藏和显示,而无需将UIViewControllerBasedStatusBarAppearance
设置添加到您的info.plist :
var showStatusBar = true
override func prefersStatusBarHidden() -> Bool {
if showStatusBar {
return false
}
return true
}
private func showStatusBar(enabled: Bool) {
showStatusBar = enabled
prefersStatusBarHidden()
}
然后在整个代码中像这样使用它:
//Hide Status Bar
showStatusBar(false)
或者
//Show Status Bar
showStatusBar(true)
补充一下,在覆盖prefersStatusBarHidden
方法或变量时,Info.plist中View controller-based status bar appearance
必须为YES,否则覆盖将无效
在 Swift 4.2 中,它现在是一个属性。
override var prefersStatusBarHidden: Bool {
return true
}
就我而言,我正在寻找状态栏以按需隐藏/显示; 而不仅仅是在视图加载或消失时。
快速 3.x
//show status bar initially
var showStatusBar = true
//set the parameters
override var prefersStatusBarHidden: Bool {
if showStatusBar == true {
//does not prefer status bar hidden
print("does not prefer status bar hidden")
return false
} else {
//does prefer status bar hidden
print("does prefer status bar hidden")
return true
}
}
//ex: hide status bar and call parameter function again whenever you want
showStatusBar = false
setNeedsStatusBarAppearanceUpdate()
Swift 5:在主视图控制器或主导航控制器(如果有)中,
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
override var prefersStatusBarHidden: Bool {
return false
}
并且plist中的“View controller-based status bar appearance”必须为YES,否则上面的代码不会被调用。
如果您想在启动应用程序时隐藏状态栏,plist 中的“状态栏最初是隐藏的”必须为 YES。 当屏幕顶部显示额外的蓝条时,这可以防止启动图像失真。
一个对我有用的解决方案; 如果要在加载时隐藏特定视图控制器上的状态栏:
import UIKit
class ViewController: UIViewController {
private var hideStatusBar: Bool = false
override var prefersStatusBarHidden: Bool {
return hideStatusBar
}
override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
return UIStatusBarAnimation.slide
}
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundcolor = .white
hideStatusBar = true
UIView.animate(withDuration: 0.3) {
self.setNeedsStatusBarAppearanceUpdate()
}
}
注意:如果您在 info.plist 中将键“基于控制器的状态栏外观”设置为“否”,则上面的代码不起作用。 您应该将密钥设置为“ YES ”或将其从 info.plist 中删除
在您的项目 General->Deployment Info->Status bar style 中选择 Hide status bar 的复选标记注意:- 它在整个应用程序中隐藏状态栏
对于 Swift 4+,请尝试以下代码(在 Swift 4.0、4.1 - IOS 10、11 上测试):
override var prefersStatusBarHidden: Bool { return true }
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
// call this func to force preferredStatusBarStyle to be read again.
setNeedsStatusBarAppearanceUpdate()
}
针对 iOS 13 和 Swift 5 更新
如果以上答案都不适合您。 检查你的 plist 看看你是否有这个:
“查看基于控制器的状态栏外观”
如果是这样,请务必将其设置为 YES!!!!
然后下面的代码将起作用。
override var prefersStatusBarHidden: Bool {
return true
}
如果您以模态方式呈现视图控制器,请尝试
viewController.hidesBottomBarWhenPushed = true
viewController.modalPresentationCapturesStatusBarAppearance = true
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
application.isStatusBarHidden = true
return true
}
您可以在ViewController
Class
scope
使用此代码
open override var prefersStatusBarHidden: Bool { return true }
在您的项目->常规->部署信息中
状态栏样式:--
刚刚标记隐藏状态栏(iOS 10)
斯威夫特 4
//MARK:- Show Status Bar
UIApplication.shared.isStatusBarHidden = false
//MARK:- Hide Status Bar
UIApplication.shared.isStatusBarHidden = true
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.