Xamarin.FormsでiOSのダークモードをOFFにする方法

iOS13以降では、UIのモードが、ダークとライトがある。当然新たにアプリを作成する場合もこの2つのモードに対応したUIを作成する必要がある。(今後この2つモードの対応が必須になるとも言われている)

しかし、アプリによってはこのモードの切り替えがよろしくない場合もある。また、今はダークモードに即座に対応できない場合もある。そのため、強制的にダークモードでもライトモードと同じ表示にしたい時がある。
今回はXamarin.FormsでのDarkModeの場合にLightModeの見た目にする方法。

OverrideUserInterfaceStyleの設定

iOSにはOverrideUserInterfaceStyleというプロパティが存在するので、これに値を入れてやることで、NavigationBarとかTabbar、ContentPageの背景のカラーを変更できる。

そしてお馴染みのCustomRendererで設定する。

NavigationRenderer

[assembly: ExportRenderer(typeof(NavigationPage), typeof(CustomNaviPageRenderer))]
namespace App.iOS
{
    public class CustomNaviPageRenderer : NavigationRenderer
    {
        protected override void OnElementChanged(VisualElementChangedEventArgs e)
        {
            base.OnElementChanged(e);
            if (UIDevice.CurrentDevice.CheckSystemVersion(13, 0))
                OverrideUserInterfaceStyle = UIUserInterfaceStyle.Light;
        }
    }
}

PageRenderer

[assembly: ExportRenderer(typeof(ContentPage), typeof(CustomPageRenderer))]
namespace App.iOS
{
    public class CustomPageRenderer : PageRenderer
    {
        protected override void OnElementChanged(VisualElementChangedEventArgs e)
        {
            base.OnElementChanged(e);
            if (UIDevice.CurrentDevice.CheckSystemVersion(13, 0))
                OverrideUserInterfaceStyle = UIUserInterfaceStyle.Light;
        }
    }
}

TabbedRenderer

[assembly: ExportRenderer(typeof(TabbedPage), typeof(CustomTabbedPageRenderer))]
namespace App.iOS
{
    public class CustomTabbedPageRenderer : TabbedRenderer
    {
        protected override void OnElementChanged(VisualElementChangedEventArgs e)
        {
            base.OnElementChanged(e);
            if (UIDevice.CurrentDevice.CheckSystemVersion(13, 0))
                OverrideUserInterfaceStyle = UIUserInterfaceStyle.Light;
        }
    }
}

それぞれiOS13.0以上かどうかチェックしているのは、12以前だとOverrideUserInterfaceStyleプロパティがなくクラッシュしてしまうためである。