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.