[ios] Swift의 상태 표시 줄 높이

Swift에서 프로그래밍 방식으로 상태 표시 줄의 높이를 어떻게 얻을 수 있습니까?

Objective-C에서는 다음과 같습니다.

[UIApplication sharedApplication].statusBarFrame.size.height.



답변

어떤 문제가 있습니까 스위프트 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


답변

Swift는 다른 언어 일뿐입니다. API 요소는 동일합니다. 아마도 다음과 같습니다.

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


답변

iOS 13 이상 및 Swift 5 용 이전 iOS 버전을 지원하는 업데이트 된 답변

 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
}

행복한 코딩!


답변

이것이 내가 사용하는 것입니다.

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


답변

Objective-C와 같습니다.

var screenStatusBarHeight: CGFloat {
    return UIApplication.sharedApplication().statusBarFrame.height
}

이것은 다음에서 표준 변수로 포함됩니다.

https://github.com/goktugyil/EZSwiftExtensions


답변

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


답변

내 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