読者です 読者をやめる 読者になる 読者になる

ぴーさんログ

だいたいXamarin.Formsのブログ

Xamarin.Formsで諦めたこと(全画面コンテンツとNavigationBar)

iOSの「マップ」のように、コンテンツを大きく見せるため、画面をタップするとナビゲーションバー(Xamarin.Formsではこの表記)が引っ込むアプリがありますね?

例(iOSの「マップ」アプリ)

f:id:ticktack623:20160222194448g:plain:w250

NavigationPage.SetHasNavigationBar() でナビゲーションバーの有無を切り替えればXamarin.Formsでこれを再現できるのではと考えましたが、結果は残念なものとなりました...

iOS / Android

f:id:ticktack623:20160222194545g:plain:w250 f:id:ticktack623:20160222194625g:plain:w265

ナビゲーションバーが切り替わる際に、画面下部に空白ができているのが分かるでしょうか?

これはNavigationPageの中のPageがナビゲーションバーの高さ分縮小されるためです。

  • バー非表示 → 表示
    1. Pageが縮小される(下に空白ができる)
    2. バーのアニメーションに合わせてPageが移動する
    3. 移動が完了して空白が埋まる
  • バー表示 → 非表示
    1. バーのアニメーションに合わせてPageが移動する
    2. 移動が完了して空白ができる
    3. Pageが拡大され、空白が埋まる

Pageのサイズが変わってしまっており、レイアウト調整などでは解決できないため諦めることにしました。 (頑張るならNavigationPageのカスタムRendererだろうか...)

おまけ

再現コード

public App()
{
    var boxView = new BoxView {
        Color = Color.Olive,
    };
    var page = new ContentPage {
        Content = boxView,
        Title = "Title",
    };
    boxView.GestureRecognizers.Add(
        new TapGestureRecognizer((_) => 
            NavigationPage.SetHasNavigationBar(page, !NavigationPage.GetHasNavigationBar(page))
        ));
    MainPage = new NavigationPage(page);
}