SwiftUI

[SwiftUI]ステータスバーの高さを取得する方法

SwiftUI

SwiftUI において、特定のデバイスに依存しない実装となることが好ましいため、デバイス毎の画面サイズ( UIKit におけるサイズ= Points )を取得する方法をまとめてみました。

Xcode : 12.4, Swift: 5

Apple開発者サイトの情報

[ads]

Appleの開発者サイトにデバイス毎のサイズが公開されています。例えば、iPhone8であれば、幅375 pt、高さ667 ptとなります。

iPhone 8
375×667 pt (750×1334 px @2x)

https://developer.apple.com/design/human-interface-guidelines/foundations/layout/

画面の高さ、幅、ステータスバーの高さを表示するサンプル

[ads]
import SwiftUI

struct ContentView: View {
    var body: some View {
        VStack(alignment: .leading) {
            Text(String(format: "screen width:\n" + "\t%.3f", UIScreen.main.bounds.width))
           Text(String(format: "screen height:\n" + "\t%.3f", UIScreen.main.bounds.height))
            Text(String(format: "statusbar height:\n" + "\t%.3f", dispSize()))
        }
        .font(.system(size: 40))
    }
    
    func dispSize() -> CGFloat{
        var statusBarHeight: CGFloat
        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
    }
}

サンプルを各デバイスで実行した結果

[ads]

このように、Appleのサイト通りの値が取得できました。特にステータスバーの高さの取得についてはひと手間かかるうえに、あまり情報が無く、見つけた情報はDeprecatedになっていたりという状況でしたので、手順など整理してみました。

参考情報

[ads]

Apple Developer Documentation

safeAreaLayoutGuide
ViewControllerのルートViewの場合、ステータスバーなどの追加のSafeareaが追加されていることが記載されています。

Stackoverflow

How to get the iPhone’s screen width in SwiftUI?

Status bar height in Swift
Deprecatedになった手順で紹介されています。

How to resolve: ‘keyWindow’ was deprecated in iOS 13.0

Ads