SwiftUI において、特定のデバイスに依存しない実装となることが好ましいため、デバイス毎の画面サイズ( UIKit におけるサイズ= Points )を取得する方法をまとめてみました。
Xcode : 12.4, Swift: 5
Apple開発者サイトの情報
[ads]
Appleの開発者サイトにデバイス毎のサイズが公開されています。例えば、iPhone8であれば、幅375 pt、高さ667 ptとなります。
iPhone 8
https://developer.apple.com/design/human-interface-guidelines/foundations/layout/
375×667 pt (750×1334 px @2x)
画面の高さ、幅、ステータスバーの高さを表示するサンプル
[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になった手順で紹介されています。