2,425 バイト追加,
2020年12月23日 (水) 02:00 [[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]]