IOS 13ではUIApplication.shared.statusBarFrame.height
警告
'statusBarFrame'はiOS 13.0で廃止されました:代わりにウィンドウシーンのstatusBarManagerプロパティを使用してください。
IOS 13で非推奨のAPIを使用せずにステータスバーの高さを取得するにはどうすればよいですか?
ソリューション:
これは、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
}
それを試してみてください。それが役に立てば幸い。
var statusBarHeight: CGFloat = 0
if #available(iOS 13.0, *) {
statusBarHeight = UIApplication.shared.keyWindow?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0
} else {
statusBarHeight = UIApplication.shared.statusBarFrame.height
}
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
}
}
値をView
sに渡したい場合は、値をEnvironment
として設定し、View
sで使用できます。例:
まず、環境キーを作成する必要があります。
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))
}
}