如何在Swift iOS应用程序中隐藏状态栏?

Jay*_*Jay 191 iphone ios ios7 swift

我想删除屏幕顶部的状态栏.

这不起作用:

func application
(application: UIApplication,
didFinishLaunchingWithOptions launchOptions: NSDictionary?)
-> Bool
{
        application.statusBarHidden = true
        return true
}
Run Code Online (Sandbox Code Playgroud)

我也尝试过:

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
}
Run Code Online (Sandbox Code Playgroud)

dre*_*wag 431

你真的应该在你的视图控制器上实现prefersStatusBarHidden:

迅捷2

override var prefersStatusBarHidden: Bool {
    return true
}
Run Code Online (Sandbox Code Playgroud)

迅捷3及以后

override var prefersStatusBarHidden: Bool {
    return true
}
Run Code Online (Sandbox Code Playgroud)

  • 我认为杰伊的目的是隐藏完整应用的状态栏.这就是为什么他会在应用程序的didFinishLaunchingWithOptions中编写隐藏功能.如何隐藏完整应用程序的状态栏? (4认同)
  • @DanBeaulieu我认为通过继承将是一个很好的解决方案.创建一个UIViewController子类,其中bar hidden设置为true,然后使所有子块继承自该子类.另一种方法可能是使用[Swizzling](http://nshipster.com/swift-objc-runtime/) (3认同)

nyc*_*nie 97

  1. 转到Info.plist文件
  2. 将鼠标悬停在其中一条线上,将显示一个(+)和( - )按钮.
  3. 单击加号按钮添加新密钥以大写字母V开头,自动第一个选择将是基于视图控制器的状态栏外观.
  4. 将其添加为KEY.
  5. 将VALUE设置为"NO"
  6. 转到AppDelegate.swift
  7. 在方法内添加代码

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject:AnyObject]?) -> Bool {
        application.statusBarHidden = true
        return true
    }
    
    Run Code Online (Sandbox Code Playgroud)

DONE!运行你的应用程序,没有更多的状态栏!

  • 除了将"查看基于控制器的状态栏外观"设置为NO之外,还要将"状态栏最初隐藏"设置为"是".然后,您无需在视图控制器中添加代码,状态栏将隐藏在整个应用程序中.Xcode 8.1,Swift 3.0.1,iOS 10 (7认同)
  • iOS 10怎么样?这在iOS 10中不起作用 (4认同)

Jos*_*ark 69

斯威夫特3

Info.plist设置View controller-based status bar appearanceNO

并致电 UIApplication.shared.isStatusBarHidden = true


Vin*_*Joy 42

如果你想在按钮上隐藏和恢复状态栏,在显示和解除滑入菜单,弹出窗口等时,你可以使用这种方法: -

要隐藏状态栏: -

UIApplication.shared.keyWindow?.windowLevel = UIWindowLevelStatusBar
Run Code Online (Sandbox Code Playgroud)

要恢复状态栏: -

UIApplication.shared.keyWindow?.windowLevel = UIWindowLevelNormal 
Run Code Online (Sandbox Code Playgroud)

  • 这是一个黑客,我不会干涉它,但它现在__工作.有点像你们都说的那样.`prefersStatusBarHidden`的问题是,如果使用`prefersStatusBarHidden`打开/关闭状态栏,那么使用约束绑定到状态栏的视图以及导航栏将以糟糕的方式移动.目前只有这个答案似乎可以解决这个问题. (3认同)
  • 如果我们想隐藏并暂时恢复状态栏,这可以使用..在我的应用程序中,当滑块菜单来自左侧时,我要隐藏状态栏.当菜单消失时,我们必须带回状态栏,就像在gmail的iOS应用程序中一样..所以在这种情况下,我们可以使用它. (2认同)

Mil*_*iuM 32

如果您更喜欢视觉方法而不是编码,请使用此方法:在您的 info.plist

在此输入图像描述 只需添加View controller-based status bar appearanceNO

Status bar is initially hidden作为YES

  • 最佳答案!队友的欢呼声! (3认同)

Moh*_*mar 28

 override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(true);
    navigationController?.navigationBar.hidden = true // for navigation bar hide
    UIApplication.sharedApplication().statusBarHidden=true; // for status bar hide
}
Run Code Online (Sandbox Code Playgroud)


atl*_*lwx 28

iOS 10/Swift 3.0的更新

不再是一个功能,现在是一个属性......

override var prefersStatusBarHidden: Bool {
    return true
}
Run Code Online (Sandbox Code Playgroud)

  • 如果你没有`set`,你就不需要`get {}`,只需写`return true` (6认同)

Sam*_*ami 16

在Swift 3.x中:

override func viewWillAppear(_ animated: Bool) {
    UIApplication.shared.isStatusBarHidden = true
}
Run Code Online (Sandbox Code Playgroud)


Dim*_*ima 12

所以这里的问题实际上与Swift无关,而是从iOS 7开始处理状态栏的外观.

默认情况下,视图控制器在屏幕上单独控制状态栏的外观.如果要使用此方法来控制状态栏,则可以为要修改外观的任何视图控制器覆盖以下方法:

prefersStatusBarHidden, preferredStatusBarStyle, preferredStatusBarAnimation,

在您的情况下,您只需实现prefersStatusBarHidden并返回true.

另一种方法是在应用程序级别控制状态栏外观.这似乎是你真正想做的事情(通过设置application.statusBarHidden).

为了使这项工作,你需要打开你的应用程序的Info.plist文件并添加密钥UIViewControllerBasedStatusBarAppearance,并给它一个值NO.


jan*_*naz 12

转到Info.plist并添加两个密钥:

转到Info.plist并添加两个密钥:


nah*_*g89 11

斯威夫特 5+

就我而言,我需要根据某些条件更新隐藏的状态栏。

因此,我创建了一个BaseViewController包含新属性的基本控制器hideStatusBar

其他视图控制器是这个基本控制器的子类。最后当我想更新状态栏行为时,我只需要更改这个hideStatusBar值。

class BaseViewController: UIViewController {

    var hideStatusBar: Bool = false {
        didSet {
            setNeedsStatusBarAppearanceUpdate()
        }
    }

    override var prefersStatusBarHidden: Bool {
           return hideStatusBar
    }
}
Run Code Online (Sandbox Code Playgroud)

如何使用

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
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

演示

这是一个演示,我UIView.animate(...)用来使过渡更平滑。

在此处输入图片说明


Jay*_*Jay 8

我实际上是自己想出来的.我将添加我的解决方案作为另一种选择.

extension UIViewController {
    func prefersStatusBarHidden() -> Bool {
        return true
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我无法实现这一点.也许是因为现在我使用的是Swift 1.2.我收到错误:"方法"prefersStatusBarHidden()'与Objective-C选择器'prefersStatusBarHidden'冲突与之前的声明与相同的Objective-C选择器".我还在开头添加了override关键字,但仍然得到相同的错误. (2认同)

Leg*_*ang 5

针对 iOS 13 和 Swift 5 进行了更新

如果以上答案都不适合您。检查你的 plist 看看是否有这个:

“查看基于控制器的状态栏外观”

如果是这样,请务必将其设置为 YES!!!!

然后下面的代码就可以工作了。

override var prefersStatusBarHidden: Bool {
    return true
}
Run Code Online (Sandbox Code Playgroud)