Wysokość paska stanu w języku Swift

98

Jak uzyskać programową wysokość paska stanu w języku Swift?

W Objective-C wygląda to tak:

[UIApplication sharedApplication].statusBarFrame.size.height.
Oleshko
źródło

Odpowiedzi:

243

Czy są jakieś problemy ze Swift 2.x :

UIApplication.sharedApplication().statusBarFrame.size.height

Swift 3 lub Swift 4 :

UIApplication.shared.statusBarFrame.height

Upewnij się, że UIKitzostał zaimportowany

import UIKit

W iOS 13 pojawi się przestarzałe ostrzeżenie „

„statusBarFrame” został wycofany w iOS 13.0: zamiast tego użyj właściwości statusBarManager sceny okna.

Aby to naprawić:

let height = view.window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0
Kirsteins
źródło
1
Nowa składnia dla Swift 3:UIApplication.shared.statusBarFrame.size.height
DoK
4
W sizeSwift 3 możesz pominąć : UIApplication.shared.statusBarFrame.heightwystarczy.
joern
1
Dzięki, było to bardzo pomocne w przypadku problemu z przepełnieniem na iPhonie X
Mario Burga
let height = view.window? .windowScene? .statusBarManager? .statusBarFrame.height ?? 0 w rzeczywistości zwraca 0
Invincible_Pain
@Invincible_Pain to prawdopodobnie dlatego, że bieżące okno nie został jeszcze załadowany, więc zastąpić view.window?zUIApplication.shared.keyWindow?
Karan Pal
5

Swift to po prostu inny język. Elementy API są takie same. Może coś takiego:

let app = UIApplication.sharedApplication()
let height = app.statusBarFrame.size.height
vcsjones
źródło
5

Zaktualizowana odpowiedź obsługująca iOS 13+ i starsze wersje iOS dla 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
}

Miłego kodowania!

Md. Ibrahim Hassan
źródło
1
Trochę poprawiaj, spraw, by stała się zmienną statyczną, a dostęp jest znacznie wyraźniejszy, tj. UIApplication.statusBarHeight
Peter
W rzeczywistości jest zaimplementowana jako funkcja globalna. Tworzenie statycznej zmiennej byłoby wygodne, gdybym zawinął ją wewnątrz klasy.
Md. Ibrahim Hassan
4

Oto, czego używam:

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

Następnie możesz:

Screen.statusBarHeight
Konstabl
źródło
1

Przerobiona odpowiedź od Ibrahima:

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
źródło
0

W moim projekcie swiftUI to zadziałało.

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
}

Podczas użytkowania

SceneDelegateDataGetter.shared.height
holahola
źródło