103

How can I get the status bar's height programmatically in Swift?

In Objective-C, it's like this:

[UIApplication sharedApplication].statusBarFrame.size.height.
Shruti Thombre
  • 1,009
  • 3
  • 11
  • 27
Oleshko
  • 2,035
  • 3
  • 13
  • 22

7 Answers7

257

Is there any problems with Swift 2.x:

UIApplication.sharedApplication().statusBarFrame.size.height

Swift 3 or Swift 4:

UIApplication.shared.statusBarFrame.height

Make sure UIKit is imported

import UIKit

In iOS 13, you will get a deprecated warning"

'statusBarFrame' was deprecated in iOS 13.0: Use the statusBarManager property of the window scene instead.

To fix this:

let height = view.window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0
PhillipJacobs
  • 1,924
  • 1
  • 13
  • 25
Kirsteins
  • 25,621
  • 8
  • 72
  • 75
  • 1
    New syntax for Swift 3: `UIApplication.shared.statusBarFrame.size.height` – DoK Oct 04 '16 at 15:53
  • 4
    You can omit `size` in Swift 3: `UIApplication.shared.statusBarFrame.height` is enough. – joern Oct 25 '16 at 12:31
  • let height = view.window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0 is returning 0 actually – Invincible_Pain Feb 27 '20 at 14:56
  • @Invincible_Pain it is probably because your current window has not been loaded yet, so replace `view.window?` with `UIApplication.shared.keyWindow?` – Karan Pal Mar 26 '20 at 12:35
  • let height = view.window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0 doesn't work any more – Raymond May 11 '20 at 22:52
15

Updated Answer Supporting iOS 13+ and older iOS Versions for Swift 5

 func getStatusBarHeight() -> CGFloat {
    var statusBarHeight: CGFloat = 0
    if #available(iOS 13.0, *) {
        let window = UIApplication.shared.windows.filter {$0.isKeyWindow}.first
        statusBarHeight = window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0
    } else {
        statusBarHeight = UIApplication.shared.statusBarFrame.height
    }
    return statusBarHeight
}

Happy Coding!

Md. Ibrahim Hassan
  • 4,681
  • 1
  • 19
  • 40
6

Swift is just a different language. The API elements are the same. Perhaps something like this:

let app = UIApplication.sharedApplication()
let height = app.statusBarFrame.size.height
vcsjones
  • 128,004
  • 28
  • 283
  • 274
6

This is what I use:

struct Screen {

 static var width: CGFloat {
  return UIScreen.main.bounds.width
 }

 static var height: CGFloat {
  return UIScreen.main.bounds.height
 }

 static var statusBarHeight: CGFloat {
  let viewController = UIApplication.shared.windows.first!.rootViewController
  return viewController!.view.window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0
 }

}

Then you can do:

Screen.statusBarHeight
Bobby
  • 5,406
  • 3
  • 30
  • 35
3

Reworked answer from Ibrahim :

extension UIApplication {
    static var statusBarHeight: CGFloat {
        if #available(iOS 13.0, *) {
            let window = shared.windows.filter { $0.isKeyWindow }.first
            return window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0
        } 
        
        return shared.statusBarFrame.height
    }
}
Peter Suwara
  • 576
  • 5
  • 13
2

Its just like in Objective-C:

var screenStatusBarHeight: CGFloat {
    return UIApplication.sharedApplication().statusBarFrame.height
}

This is included as a standard variable in:

https://github.com/goktugyil/EZSwiftExtensions

Esqarrouth
  • 35,175
  • 17
  • 147
  • 154
0

On my swiftUI project, this worked.

import UIKit
import SwiftUI

class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    
    var window: UIWindow?

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        let contentView = ContentView()
        if let windowScene = scene as? UIWindowScene {
            let window = UIWindow(windowScene: windowScene)
            
            if let statusBarHeight = window.windowScene?.statusBarManager?.statusBarFrame.height {
            SceneDelegateDataGetter.shared.height = statusBarHeight
            }
            
            window.rootViewController = HostingController(rootView: contentView)
            self.window = window
            window.makeKeyAndVisible()
        }
    }

class SceneDelegateDataGetter {
    static let shared = SceneDelegateDataGetter()
    
    public fileprivate(set) var height: CGFloat = 0
}

When use,

SceneDelegateDataGetter.shared.height
holahola
  • 83
  • 8