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.

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

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

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!


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


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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.