Hauteur de la barre d'état dans Swift

98

Comment puis-je obtenir la hauteur de la barre d'état par programmation dans Swift?

En Objective-C, c'est comme ça:

[UIApplication sharedApplication].statusBarFrame.size.height.
Oleshko
la source

Réponses:

243

Y a-t-il des problèmes avec Swift 2.x :

UIApplication.sharedApplication().statusBarFrame.size.height

Swift 3 ou Swift 4 :

UIApplication.shared.statusBarFrame.height

Assurez-vous qu'il UIKitest importé

import UIKit

Dans iOS 13, vous recevrez un avertissement obsolète "

'statusBarFrame' était obsolète dans iOS 13.0: utilisez plutôt la propriété statusBarManager de la scène de fenêtre.

Pour résoudre ce problème:

let height = view.window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0
Kirsteins
la source
1
Nouvelle syntaxe pour Swift 3:UIApplication.shared.statusBarFrame.size.height
DoK
4
Vous pouvez omettre sizedans Swift 3: UIApplication.shared.statusBarFrame.heightc'est assez.
joern
1
Merci, cela a été très utile pour un problème de débordement sur l'iPhone X
Mario Burga
laissez height = view.window? .windowScene? .statusBarManager? .statusBarFrame.height ?? 0 renvoie 0 en fait
Invincible_Pain
@Invincible_Pain c'est probablement parce que votre fenêtre actuelle n'a pas encore été chargée, alors remplacez-la view.window?parUIApplication.shared.keyWindow?
Karan Pal
5

Swift est juste une langue différente. Les éléments de l'API sont les mêmes. Peut-être quelque chose comme ça:

let app = UIApplication.sharedApplication()
let height = app.statusBarFrame.size.height
vcsjones
la source
5

Réponse mise à jour prenant en charge iOS 13+ et les anciennes versions d'iOS pour 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
}

Bon codage!

Md. Ibrahim Hassan
la source
1
Un petit tweak, en faire un var statique, alors l'accès est beaucoup plus clair ie. UIApplication.statusBarHeight
Peter Suwara
Il est en fait implémenté comme une fonction globale. Faire un var statique serait pratique si je l'enveloppe dans une classe.
Md. Ibrahim Hassan le
4

C'est ce que j'utilise:

struct Screen {
    static var width: CGFloat {
        return UIScreen.main.bounds.width
    }
    static var height: CGFloat {
        return UIScreen.main.bounds.height
    }
    static var statusBarHeight: CGFloat {
        return UIApplication.shared.statusBarFrame.size.height
    }
}

Ensuite, vous pouvez faire:

Screen.statusBarHeight
Policier
la source
1

Réponse retravaillée d'Ibrahim:

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

Sur mon projet swiftUI, cela a fonctionné.

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
}

Lors de l'utilisation,

SceneDelegateDataGetter.shared.height
Hola hola
la source