Altezza della barra di stato in Swift


98

Come posso ottenere l'altezza della barra di stato a livello di programmazione in Swift?

In Objective-C, è così:

[UIApplication sharedApplication].statusBarFrame.size.height.

Risposte:


243

Ci sono problemi con Swift 2.x :

UIApplication.sharedApplication().statusBarFrame.size.height

Swift 3 o Swift 4 :

UIApplication.shared.statusBarFrame.height

Assicurati che UIKitsia importato

import UIKit

In iOS 13, riceverai un avviso obsoleto "

'statusBarFrame' è stato deprecato in iOS 13.0: utilizza invece la proprietà statusBarManager della scena della finestra.

Per risolvere questo problema:

let height = view.window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0

1
Nuova sintassi per Swift 3:UIApplication.shared.statusBarFrame.size.height
DoK

4
Puoi omettere sizein Swift 3: UIApplication.shared.statusBarFrame.heightè sufficiente.
joern

1
Grazie, è stato molto utile per un problema di overflow su iPhone X
Mario Burga

let height = view.window? .windowScene? .statusBarManager? .statusBarFrame.height ?? 0 sta restituendo 0 in realtà
Invincible_Pain

@Invincible_Pain probabilmente è perché la tua finestra corrente non è stata ancora caricata, quindi sostituisci view.window?conUIApplication.shared.keyWindow?
Karan Pal,

5

Swift è solo una lingua diversa. Gli elementi API sono gli stessi. Forse qualcosa del genere:

let app = UIApplication.sharedApplication()
let height = app.statusBarFrame.size.height

5

Risposta aggiornata che supporta iOS 13+ e versioni precedenti di iOS per 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
}

Buona programmazione!


1
Un piccolo aggiustamento, rendilo una var statica, quindi l'accesso è molto più chiaro, ad es. UIApplication.statusBarHeight
Peter Suwara il

In realtà è implementato come una funzione globale. Fare una var statica sarebbe conveniente se lo racchiudessi in una classe.
Md. Ibrahim Hassan il

4

Questo è quello che uso:

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

Quindi puoi fare:

Screen.statusBarHeight


1

Risposta rielaborata di 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

Nel mio progetto swiftUI, ha funzionato.

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
}

Quando si usa,

SceneDelegateDataGetter.shared.height
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.