Altura de la barra de estado en Swift

98

¿Cómo puedo obtener la altura de la barra de estado mediante programación en Swift?

En Objective-C, es así:

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

Respuestas:

243

¿Hay algún problema con Swift 2.x ?

UIApplication.sharedApplication().statusBarFrame.size.height

Swift 3 o Swift 4 :

UIApplication.shared.statusBarFrame.height

Asegúrate de que UIKitsea ​​importado

import UIKit

En iOS 13, recibirá una advertencia obsoleta "

'statusBarFrame' quedó obsoleto en iOS 13.0: utilice la propiedad statusBarManager de la escena de la ventana en su lugar.

Para arreglar esto:

let height = view.window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0
Kirsteins
fuente
1
Nueva sintaxis para Swift 3:UIApplication.shared.statusBarFrame.size.height
DoK
4
Puede omitir sizeen Swift 3: UIApplication.shared.statusBarFrame.heightes suficiente.
joern
1
Gracias, fue muy útil para un problema de desbordamiento en el iPhone X
Mario Burga
let height = view.window? .windowScene? .statusBarManager? .statusBarFrame.height ?? 0 está devolviendo 0 en realidad
Invincible_Pain
@Invincible_Pain probablemente se deba a que su ventana actual aún no se ha cargado, así que reemplácela view.window?conUIApplication.shared.keyWindow?
Karan Pal
5

Swift es solo un idioma diferente. Los elementos de la API son los mismos. Quizás algo como esto:

let app = UIApplication.sharedApplication()
let height = app.statusBarFrame.size.height
vcsjones
fuente
5

Respuesta actualizada compatible con iOS 13+ y versiones anteriores de iOS para 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
}

¡Feliz codificación!

Md. Ibrahim Hassan
fuente
1
Un pequeño ajuste, conviértalo en una var estática, entonces el acceso es mucho más claro, es decir. UIApplication.statusBarHeight
Peter Suwara
En realidad, se implementa como una función global. Hacer una var estática sería conveniente si la envuelvo dentro de una clase.
Md. Ibrahim Hassan
4

Esto es lo que 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
    }
}

Entonces puedes hacer:

Screen.statusBarHeight
Poli
fuente
1

Respuesta reelaborada de 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
fuente
0

En mi proyecto swiftUI, esto funcionó.

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
}

Cuando se usa,

SceneDelegateDataGetter.shared.height
Hola hola
fuente