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


98

Як я можу програмно отримати висоту рядка стану в Swift?

У Objective-C це так:

[UIApplication sharedApplication].statusBarFrame.size.height.

Відповіді:


243

Чи є проблеми зі 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

4
У sizeSwift 3 можна опустити : UIApplication.shared.statusBarFrame.heightдосить.
joern

1
Дякую, це було дуже корисно для проблеми із переповненням iPhone X
Mario Burga

нехай висота = view.window? .windowScene? .statusBarManager? .statusBarFrame.height ?? 0 повертається 0 фактично
Invincible_Pain

@Invincible_Pain це, мабуть, тому, що ваше поточне вікно ще не завантажено, тому замініть view.window?наUIApplication.shared.keyWindow?
Karan Pal

5

Свіфт - це просто інша мова. Елементи API однакові. Можливо, щось подібне:

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

5

Оновлений відповідь, що підтримує версії 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
}

Щасливе кодування!


1
Трохи налаштуйте, зробіть це статичним варом, тоді доступ набагато чіткіший, тобто. UIApplication.statusBarHeight
Пітер Сувара

Він фактично реалізується як глобальна функція. Зробити статичну вару було б зручно, якби я загорнув її всередину класу.
Пані Ібрагім Хасан

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.