web-dev-qa-db-ja.com

プログラムでiOSステータスバーの高さを取得する方法

私は現在、iPhone/iPadの上部にあるステータスバー(時間、バッテリー、およびネットワーク接続を含む)が、網膜以外のスクリーン用に20ピクセル、網膜スクリーン用に40ピクセルであることを知っています。ハードコーディング値なしでこれを決定できるようにするため。プログラムでステータスバーの高さを把握することは可能ですか?

267
lehn0058

[UIApplication sharedApplication].statusBarFrame.size.height。ただし、すべてのサイズはピクセル単位ではなくポイント単位であるため、ステータスバーの高さは常に20です。

更新この回答が役立つと思われるので、詳しく説明します。

ステータスバーの高さは、実際には20.0fポイントexcept以下の場合に等しくなります。

  • ステータスバーはsetStatusBarHidden:withAnimation:メソッドで非表示にされ、その高さは0.0fポイントに等しくなります。
  • ここで@Antonが指摘したように、電話アプリケーションの外部からの着信通話中、または録音セッション中のステータスバーの高さは40.0fポイントです。

ビューの高さに影響するステータスバーのケースもあります。通常、ビューの高さは、特定の向きの画面の寸法からステータスバーの高さを引いたものに等しくなります。ただし、ビューが表示された後にステータスバーをアニメーション化(表示または非表示)すると、ステータスバーのフレームは変更されますが、ビューは変更されません、ステータスバーのアニメーションの後(または、アニメーションの開始時にステータスバーの高さが最終値に設定されるため、アニメーション中に)手動でビューのサイズを変更する必要があります。

更新2。ユーザーインターフェイスの向きの場合もあります。ステータスバーは方向の値を尊重しないため、portraitモードのステータスバーの高さの値は[UIApplication sharedApplication].statusBarFrame.size.heightです(はい、デフォルトの方向は常に縦向き、アプリのinfo.plistの内容にかかわらず、landscape-[UIApplication sharedApplication].statusBarFrame.size.widthの場合。 UIViewControllerの外側でself.interfaceOrientationが利用できない場合のUIの現在の向きを確認するには、[UIApplication sharedApplication].statusBarOrientationを使用します。

iOS7用の更新。ステータスバーの視覚スタイルが変更された場合でも、それはまだ存在し、フレームは同じように動作します。私が手に入れたステータスバーに関する唯一の興味深い発見–共有:あなたのUINavigationBartiled背景もステータスバーに並べて表示されます。いくつかの興味深いデザイン効果を達成するか、ステータスバーに色を付けるだけです。これも、ステータスバーの高さに影響しません。

Navigation bar tiled background is also tiled to status bar

496
Kyr Dunenkoff

Martinの提案「iPhoneステータスバーの高さの取得 」を参照してください。

CGFloat AACStatusBarHeight()
{
    CGSize statusBarSize = [[UIApplication sharedApplication] statusBarFrame].size;
    return MIN(statusBarSize.width, statusBarSize.height);
}

そしてSwiftで

func statusBarHeight() -> CGFloat {
    let statusBarSize = UIApplication.shared.statusBarFrame.size
    return Swift.min(statusBarSize.width, statusBarSize.height)
}

それはハックのように見えますが、実際はかなり堅実です。とにかく、それが唯一の有効な解決策です。

古い答え

あなたのカスタムサブクラスのUIViewControllerに入る次のコードは、ランドスケープをサポートするためにほとんどうまくいきました。しかし、私はそれが動作しなかった(高さと幅を切り替えた)コーナーケース(右から>サポートされていない逆さまに>左に回転するとき)に気づいた。

BOOL isPortrait = self.interfaceOrientation == UIInterfaceOrientationPortrait;
CGSize statusBarSize = [UIApplication sharedApplication].statusBarFrame.size;
CGFloat statusBarHeight = (isPortrait ? statusBarSize.height : statusBarSize.width);
93
ma11hew28

これを試して:

CGFloat statusBarHeight = [[UIApplication sharedApplication] statusBarFrame].size.height;
21
user529758

Swift 3またはSwift 4:

UIApplication.shared.statusBarFrame.height
14
Wilson

ステータスバーの高さは通常20ptですが、状況によってはその2倍になることがあります。

  • あなたが電話をかけているとき(それはかなり一般的なシナリオです)。
  • ボイスレコーダー、Skype、または類似のアプリがバックグラウンドでマイクを使用しているとき。
  • パーソナルホットスポットが有効になっているとき。

ただそれを試してください、そしてあなたはあなた自身のために見えるでしょう。高さを20ptにハードコーディングすると、通常はうまくいきません。

だから私は2番目のH2CO3の答え:

statusBarHeight = [[UIApplication sharedApplication] statusBarFrame].size.height;
10
Macondo2Seattle

EDITビューのコンテンツの先頭に配置する場所を決めるためのiOS 11の方法は、UIViewのsafeAreaLayoutGuideです。 を参照してください。UIViewのドキュメント .

非推奨の回答iOS 7+をターゲットとしている場合、UIViewControllerのドキュメントには、viewControllerのtopLayoutGuideプロパティでステータスバーの下部、またはナビゲーションバーの下部を表示するようにアドバイスされています。それがまた見えるならば。それは役に立つかもしれません、そして確かに以前の解決策の多くよりハックが少ないです。

9

ステータスバーのフレームが画面の座標空間に入ることを忘れないでください。横モードで起動すると、幅と高さが入れ替わっていることがわかります。横向きをサポートする場合は、代わりにこのバージョンのコードを使用することを強くお勧めします。

CGRect statusBarFrame = [self.window convertRect:[UIApplication sharedApplication].statusBarFrame toView:view];

その後、statusBarFrameのheightプロパティを直接読み取ることができます。この場合の「ビュー」は、測定値を利用したいビュー、おそらくアプリケーションウィンドウのルートビューコントローラです。

ちなみに、電話中にステータスバーが高くなるだけでなく、ステータスバーが意図的に隠されている場合は、ステータスバーが0になることもあります。

5
Ash

これはスクリーンステータスバーの高さを取得するための迅速な方法です:

var screenStatusBarHeight: CGFloat {
    return UIApplication.sharedApplication().statusBarFrame.height
}

これらは私のプロジェクトの標準機能として含まれています。 https://github.com/goktugyil/EZSwiftExtensions

2
Esqarrouth

デフォルトでは、iOSのステータスバーの高さは20 ptです。

詳細情報: http://www.idev101.com/code/User_Interface/sizes.html

0
Chris Alan

ステータスバーの高さに直接アクセスするのではなく、計算する方法を見つけました。

ナビゲーションバーの高さ - topLayoutGuideの長さ=ステータスバーの高さ

迅速:

let statusBarHeight = self.topLayoutGuide.length-self.navigationController?.navigationBar.frame.height

self.topLayoutGuide.lengthは半透明のバーで覆われている一番上の領域で、self.navigationController?.navigationBar.frame.heightはステータスバーを除いた半透明のバーです。通常44ptです。そのため、この方法を使用すると、電話によるステータスバーの高さの変化を気にせずに、ステータスバーの高さを簡単に計算できます。

0
Henry Ngan