Höhe der Statusleiste in Swift

98

Wie kann ich die Höhe der Statusleiste in Swift programmgesteuert ermitteln?

In Objective-C sieht es so aus:

[UIApplication sharedApplication].statusBarFrame.size.height.
Oleshko
quelle

Antworten:

243

Gibt es Probleme mit Swift 2.x :

UIApplication.sharedApplication().statusBarFrame.size.height

Swift 3 oder Swift 4 :

UIApplication.shared.statusBarFrame.height

Stellen Sie sicher, dass UIKitimportiert wird

import UIKit

In iOS 13 erhalten Sie eine veraltete Warnung "

'statusBarFrame' war in iOS 13.0 veraltet: Verwenden Sie stattdessen die Eigenschaft statusBarManager der Fensterszene.

Um dies zu beheben:

let height = view.window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0
Kirsteins
quelle
1
Neue Syntax für Swift 3:UIApplication.shared.statusBarFrame.size.height
DoK
4
Sie können sizein Swift 3 weglassen : UIApplication.shared.statusBarFrame.heightist genug.
Joern
1
Vielen Dank, es war sehr hilfreich für ein Überlaufproblem auf dem iPhone X
Mario Burga
let height = view.window? .windowScene? .statusBarManager? .statusBarFrame.height ?? 0 gibt tatsächlich 0 zurück
Invincible_Pain
@Invincible_Pain es ist wahrscheinlich , weil das aktuelle Fenster noch nicht geladen wurde, so ersetzen view.window?mitUIApplication.shared.keyWindow?
Karan Pal
5

Swift ist nur eine andere Sprache. Die API-Elemente sind identisch. Vielleicht so etwas:

let app = UIApplication.sharedApplication()
let height = app.statusBarFrame.size.height
vcsjones
quelle
4

Das benutze ich:

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

Dann können Sie tun:

Screen.statusBarHeight
Bobby
quelle
4

Aktualisierte Antwort Unterstützt iOS 13+ und ältere iOS-Versionen für 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
}

Viel Spaß beim Codieren!

Md. Ibrahim Hassan
quelle
1
Eine kleine Änderung, machen Sie es zu einer statischen Variable, dann ist der Zugriff viel klarer, dh. UIApplication.statusBarHeight
Peter Suwara
Es ist tatsächlich als globale Funktion implementiert. Das Erstellen einer statischen Variable wäre praktisch, wenn ich sie in eine Klasse einpacken würde.
Md. Ibrahim Hassan
1

Überarbeitete Antwort von 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
quelle
0

Bei meinem swiftUI-Projekt hat dies funktioniert.

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
}

Bei Verwendung,

SceneDelegateDataGetter.shared.height
Hola Hola
quelle