メインメニューを開く

差分

Xamarin.iOSでステータスバーの高さを取得する

2,425 バイト追加, 2020年12月23日 (水) 02:00
ページの作成:「iOSiPadOSで画面サイズを取得すると「ステータスバーまで含んだ大きさ」を返してくる。 このため何も考えずにプログ…」
[[iOS]]や[[iPadOS]]で画面サイズを取得すると「ステータスバーまで含んだ大きさ」を返してくる。
このため何も考えずに[[プログラム]]で動的にビューを配置するとステータスバーにめり込む(重なる)ため、「ステータスバーの高さ」を取得して「まともなフルサイズ」を自前で計算する必要がある。
<source lang="csharp">
var screenSize = this.View.Frame;

var statusBarHeight = (なんらかの手法でステータスバーの高さを取得する);

var fullSize = new CGRect(
screenSize.X,
screenSize.Y + statusBarHeight,
screenSize.Width,
screenSize.Height - statusBarHeight);
</source>

== iOS 12まで ==
iOS 12まではUIApplicationからステータスバーの高さを取得できた。
<source lang="csharp">
var h12 = UIApplication.SharedApplication?.StatusBarFrame.Height ?? 0;
</source>

== iOS 13から ==
iOS 13からはUIWindowのStatusBarManager経由でステータスバーの高さを取得するように仕様変更された。
<source lang="csharp">
var h13 = this.View?.Window?.WindowScene?.StatusBarManager?.StatusBarFrame.Height ?? 0;
</source>

なお、前述のiOS 12までの古い方法をiOS 13で使うと「ゼロ」が返ってくる。

== UIWindowが有効になるタイミング ==
なお、UIViewControllerにおいてUIWindowが取得できるようになるのは「ViewDidAppear以降」となっているので注意すること。
ViewDidLoadやViewWillAppearの段階ではWindowプロパティは「null」となっている。

<source lang="csharp">
public partial class ViewController : UIViewController
{
public nfloat StatusBarHeight => this.View?.Window?.WindowScene?.StatusBarManager?.StatusBarFrame.Height ?? 0;

public override void ViewDidLoad()
{
base.ViewDidLoad();
// ここで高さが取れる。
Console.WriteLine($"ViewDidLoad={StatusBarHeight}");
}
public override void ViewWillAppear(bool animated)
{
base.ViewWillAppear(animated);
// まだ「0」
Console.WriteLine($"ViewWillAppear={StatusBarHeight}");
}

public override void ViewDidAppear(bool animated)
{
base.ViewDidAppear(animated);
// ここで高さが取れる。
Console.WriteLine($"ViewDidAppear={StatusBarHeight}");
}
}
</source>

[[category: Xamarin.iOS]]