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.