Swiftのステータスバーの高さ


98

プログラムでステータスバーの高さをSwiftで取得するにはどうすればよいですか?

Objective-Cでは、次のようになります。

[UIApplication sharedApplication].statusBarFrame.size.height.

回答:


243

問題がありスウィフト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

1
Swift 3の新しい構文UIApplication.shared.statusBarFrame.size.height
DoK

4
sizeSwift 3では省略できます:これUIApplication.shared.statusBarFrame.heightで十分です。
joern '25年

1
おかげで、iPhone Xのオーバーフローの問題に非常に役立ちました
マリオバーガ

let height = view.window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0は実際には0を返します
Invincible_Pain

@Invincible_Painこれは、現在のウィンドウがまだ読み込まれていないためと考えられます。置き換えview.window?てくださいUIApplication.shared.keyWindow?
Karan Pal

5

Swiftは別の言語です。API要素は同じです。おそらくこのようなもの:

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

5

Swift 5のiOS 13+以前の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
}

ハッピーコーディング!


1
少し調整して、それを静的変数にし、アクセスをより明確にします。UIApplication.statusBarHeight
Peter Suwara

実際にはグローバル関数として実装されています。静的変数を作成すると、クラス内にまとめれば便利です。
Md。Ibrahim Hassan

4

これは私が使用するものです:

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


1

イブラヒムからの回答を書き直した:

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

0

私の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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.