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.

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

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

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

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!


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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.