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.

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

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

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!


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


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
    }
}

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.