私は現在、iPhone/iPadの上部にあるステータスバー(時間、バッテリー、およびネットワーク接続を含む)が、網膜以外のスクリーン用に20ピクセル、網膜スクリーン用に40ピクセルであることを知っています。ハードコーディング値なしでこれを決定できるようにするため。プログラムでステータスバーの高さを把握することは可能ですか?
[UIApplication sharedApplication].statusBarFrame.size.height
。ただし、すべてのサイズはピクセル単位ではなくポイント単位であるため、ステータスバーの高さは常に20です。
更新この回答が役立つと思われるので、詳しく説明します。
ステータスバーの高さは、実際には20.0fポイントexcept以下の場合に等しくなります。
setStatusBarHidden:withAnimation:
メソッドで非表示にされ、その高さは0.0fポイントに等しくなります。ビューの高さに影響するステータスバーのケースもあります。通常、ビューの高さは、特定の向きの画面の寸法からステータスバーの高さを引いたものに等しくなります。ただし、ビューが表示された後にステータスバーをアニメーション化(表示または非表示)すると、ステータスバーのフレームは変更されますが、ビューは変更されません、ステータスバーのアニメーションの後(または、アニメーションの開始時にステータスバーの高さが最終値に設定されるため、アニメーション中に)手動でビューのサイズを変更する必要があります。
更新2。ユーザーインターフェイスの向きの場合もあります。ステータスバーは方向の値を尊重しないため、portraitモードのステータスバーの高さの値は[UIApplication sharedApplication].statusBarFrame.size.height
です(はい、デフォルトの方向は常に縦向き、アプリのinfo.plistの内容にかかわらず、landscape-[UIApplication sharedApplication].statusBarFrame.size.width
の場合。 UIViewController
の外側でself.interfaceOrientation
が利用できない場合のUIの現在の向きを確認するには、[UIApplication sharedApplication].statusBarOrientation
を使用します。
iOS7用の更新。ステータスバーの視覚スタイルが変更された場合でも、それはまだ存在し、フレームは同じように動作します。私が手に入れたステータスバーに関する唯一の興味深い発見–共有:あなたのUINavigationBar
のtiled背景もステータスバーに並べて表示されます。いくつかの興味深いデザイン効果を達成するか、ステータスバーに色を付けるだけです。これも、ステータスバーの高さに影響しません。
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);
これを試して:
CGFloat statusBarHeight = [[UIApplication sharedApplication] statusBarFrame].size.height;
Swift 3またはSwift 4:
UIApplication.shared.statusBarFrame.height
ステータスバーの高さは通常20ptですが、状況によってはその2倍になることがあります。
ただそれを試してください、そしてあなたはあなた自身のために見えるでしょう。高さを20ptにハードコーディングすると、通常はうまくいきません。
だから私は2番目のH2CO3の答え:
statusBarHeight = [[UIApplication sharedApplication] statusBarFrame].size.height;
EDITビューのコンテンツの先頭に配置する場所を決めるためのiOS 11の方法は、UIViewのsafeAreaLayoutGuide
です。 を参照してください。UIViewのドキュメント .
非推奨の回答iOS 7+をターゲットとしている場合、UIViewControllerのドキュメントには、viewControllerのtopLayoutGuide
プロパティでステータスバーの下部、またはナビゲーションバーの下部を表示するようにアドバイスされています。それがまた見えるならば。それは役に立つかもしれません、そして確かに以前の解決策の多くよりハックが少ないです。
ステータスバーのフレームが画面の座標空間に入ることを忘れないでください。横モードで起動すると、幅と高さが入れ替わっていることがわかります。横向きをサポートする場合は、代わりにこのバージョンのコードを使用することを強くお勧めします。
CGRect statusBarFrame = [self.window convertRect:[UIApplication sharedApplication].statusBarFrame toView:view];
その後、statusBarFrameのheightプロパティを直接読み取ることができます。この場合の「ビュー」は、測定値を利用したいビュー、おそらくアプリケーションウィンドウのルートビューコントローラです。
ちなみに、電話中にステータスバーが高くなるだけでなく、ステータスバーが意図的に隠されている場合は、ステータスバーが0になることもあります。
これはスクリーンステータスバーの高さを取得するための迅速な方法です:
var screenStatusBarHeight: CGFloat {
return UIApplication.sharedApplication().statusBarFrame.height
}
これらは私のプロジェクトの標準機能として含まれています。 https://github.com/goktugyil/EZSwiftExtensions
デフォルトでは、iOSのステータスバーの高さは20 pt
です。
ステータスバーの高さに直接アクセスするのではなく、計算する方法を見つけました。
ナビゲーションバーの高さ - topLayoutGuideの長さ=ステータスバーの高さ
迅速:
let statusBarHeight = self.topLayoutGuide.length-self.navigationController?.navigationBar.frame.height
self.topLayoutGuide.length
は半透明のバーで覆われている一番上の領域で、self.navigationController?.navigationBar.frame.height
はステータスバーを除いた半透明のバーです。通常44ptです。そのため、この方法を使用すると、電話によるステータスバーの高さの変化を気にせずに、ステータスバーの高さを簡単に計算できます。