web-dev-qa-db-ja.com

iOS 13でステータスバーの高さを取得する方法

IOS 13ではUIApplication.shared.statusBarFrame.height警告

'statusBarFrame'はiOS 13.0で廃止されました:代わりにウィンドウシーンのstatusBarManagerプロパティを使用してください。

IOS 13で非推奨のAPIを使用せずにステータスバーの高さを取得するにはどうすればよいですか?

20
Jordan H

ソリューション:

これは、iPhoneX +デバイスでも警告なしに機能するようです。

スイフト4.2/5

if #available(iOS 13.0, *) {
    let window = UIApplication.shared.windows.filter {$0.isKeyWindow}.first
    lar statusBarHeight = window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0
} else {
    statusBarHeight = UIApplication.shared.statusBarFrame.height
}

それを試してみてください。それが役に立てば幸い。

0
var statusBarHeight: CGFloat = 0
if #available(iOS 13.0, *) {
    statusBarHeight = UIApplication.shared.keyWindow?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0
} else {
    statusBarHeight = UIApplication.shared.statusBarFrame.height
}
0
Andrew Bell

iOS 13の場合:

SceneDelegate内:

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
 if let windowScene = scene as? UIWindowScene {
    let window = UIWindow(windowScene: windowScene)
    let statusBarSize = windowScene.statusBarManager!.statusBarFrame
    ...// initialize your root view controller
 }
}

値をViewsに渡したい場合は、値をEnvironmentとして設定し、Viewsで使用できます。例:

まず、環境キーを作成する必要があります。

struct StatusBarSizeEnvironmentKey: EnvironmentKey {
   public static let defaultValue: CGRect = CGRect()
}

extension EnvironmentValues {
  public var statusBarSize: CGRect {
    set { self[StatusBarSizeEnvironmentKey.self] = newValue }
    get { self[StatusBarSizeEnvironmentKey] }
  }
}

SceneDelegateに値を設定します。

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
 if let windowScene = scene as? UIWindowScene {
    let window = UIWindow(windowScene: windowScene)
    let statusBarSize = windowScene.statusBarManager!.statusBarFrame
    window.rootViewController = UIHostingController(rootView: YourView()
             .environment(\.statusBarSize, statusBarSize))
 }
}
0