Высота строки состояния в Swift

99

Как я могу программно получить высоту строки состояния в Swift?

В Objective-C это так:

[UIApplication sharedApplication].statusBarFrame.size.height.
Олешко
источник

Ответы:

245

Есть ли проблемы со Swift 2.x :

UIApplication.sharedApplication().statusBarFrame.size.height

Swift 3 или Swift 4 :

UIApplication.shared.statusBarFrame.height

Убедитесь, что UIKitимпортирован

import UIKit

В iOS 13 вы получите предупреждение об устаревании "

'statusBarFrame' устарел в iOS 13.0: вместо этого используйте свойство statusBarManager сцены окна.

Чтобы исправить это:

let height = view.window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0
Кирстейнс
источник
1
Новый синтаксис для Swift 3:UIApplication.shared.statusBarFrame.size.height
DoK 04
4
sizeВ Swift 3 можно опустить : UIApplication.shared.statusBarFrame.heightдостаточно.
Joern
1
Спасибо, это было очень полезно для проблемы переполнения на iPhone X
Марио Бурга
let height = view.window? .windowScene? .statusBarManager? .statusBarFrame.height ?? 0 на самом деле возвращает 0
Invincible_Pain
@Invincible_Pain это, вероятно, связано с тем, что ваше текущее окно еще не было загружено, поэтому замените его view.window?наUIApplication.shared.keyWindow?
Karan Pal
6

Обновленный ответ, поддерживающий iOS 13+ и более ранние версии iOS для 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
}

Удачного кодирования!

Md. Ибрагим Хасан
источник
1
Небольшая настройка, сделайте статическую переменную, тогда доступ будет намного понятнее, т.е. UIApplication.statusBarHeight
Питер Сувара
1
Фактически это реализовано как глобальная функция. Было бы удобно создать статическую переменную, если бы я обернул ее внутри класса.
Md. Ибрагим Хасан,
5

Swift - это просто другой язык. Элементы API такие же. Возможно что-то вроде этого:

let app = UIApplication.sharedApplication()
let height = app.statusBarFrame.size.height
vcsjones
источник
4

Вот что я использую:

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

Тогда вы сможете:

Screen.statusBarHeight
Бобби
источник
1

Переделанный ответ Ибрагима:

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

В моем проекте swiftUI это сработало.

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
}

При использовании

SceneDelegateDataGetter.shared.height
Привет привет
источник