Xamarin.Forms.Shell:如何管理StatusBar颜色

Xamarin.Forms.Shell: how to manage StatusBar color

我开发了一个小型 Xamarin.Forms.Shell 应用程序,但我没有找到如何应用 自定义颜色 StatusBar前景背景

我的应用使用了非常基本的配色方案:

我想为StatusBar保留相同的颜色,但事实并非如此:

=> 在 不管理 DarkMode 的设备上,或者当 LightMode 处于活动状态时 StatusBar 信息是很好地展示

=> 但当 DarkMode 处于活动状态时情况并非如此,因为这些信息是隐藏的

=> 如果我指定 white 颜色,则 StatusBar 信息不可见,因为还有白色

=> 而如果我指定 gray 颜色,则 StatusBar 信息清晰可见

所以我尝试应用给定的解决方案 :

=> 我如何管理 iOS StatusBar 前景色? Android够吗?

Op通过.

中的解决方案解决了问题
public void SetColoredStatusBar(string hexColor)
{
    Device.BeginInvokeOnMainThread(() =>
    {
        if (UIDevice.CurrentDevice.CheckSystemVersion(13, 0))
        {
            UIView statusBar = new UIView(UIApplication.SharedApplication.KeyWindow.WindowScene.StatusBarManager.StatusBarFrame);
            statusBar.BackgroundColor = Color.FromHex(hexColor).ToUIColor();
            UIApplication.SharedApplication.KeyWindow.AddSubview(statusBar);
        }
        else
        {
            UIView statusBar = UIApplication.SharedApplication.ValueForKey(new NSString("statusBar")) as UIView;
            if (statusBar.RespondsToSelector(new ObjCRuntime.Selector("setBackgroundColor:")))
            {
                statusBar.BackgroundColor = Color.FromHex(hexColor).ToUIColor();
            }
        }
        UIApplication.SharedApplication.SetStatusBarStyle(UIStatusBarStyle.LightContent, false);
        GetCurrentViewController().SetNeedsStatusBarAppearanceUpdate();
    });
}

=========================================== ============================

你的应用支持dark mode吗?

如果您的应用程序低于 DarkMode,状态栏文本颜色将变为白色。如果您不支持 Darkmode 并且仍然 white for the Background of the NavigationBar and the TabBar,白色文本在白色背景下将不可见。

您可以使用AppThemeBinding在不同的模式下设置不同的颜色。

<Shell.Resources>
    <ResourceDictionary>
        <Color x:Key="NavigationPrimary">#2196F3</Color>
        <Style x:Key="BaseStyle" TargetType="Element">
            <Setter Property="Shell.BackgroundColor" Value="{AppThemeBinding Light=White, Dark=Black}" />
            <Setter Property="Shell.ForegroundColor" Value="{AppThemeBinding Light=Black, Dark=White}" />
            <Setter Property="Shell.TitleColor" Value="White" />
            <Setter Property="Shell.DisabledColor" Value="#B4FFFFFF" />
            <Setter Property="Shell.UnselectedColor" Value="#95FFFFFF" />
            <Setter Property="Shell.TabBarBackgroundColor" Value="White" />
            <Setter Property="Shell.TabBarForegroundColor" Value="Red"/>
            <Setter Property="Shell.TabBarUnselectedColor" Value="Black"/>
            <Setter Property="Shell.TabBarTitleColor" Value="Black"/>
        </Style>
        <Style TargetType="TabBar" BasedOn="{StaticResource BaseStyle}" />
    </ResourceDictionary>
</Shell.Resources>

如果您想在不同的应用主题下保持状态栏颜色相同,请使用自定义渲染器:

[assembly:ExportRenderer (typeof(ContentPage), typeof(customPageRenderer))]
namespace App479.iOS
{
    public class customPageRenderer : PageRenderer
    {

        public override void ViewDidAppear(bool animated)
        {
            base.ViewDidAppear(animated);

            this.NavigationController.NavigationBar.BarStyle = UIBarStyle.Default;

        }

        //if you content page does not have a NavigationBar, oveerride this method
        public override UIStatusBarStyle PreferredStatusBarStyle()
        {
            return UIStatusBarStyle.DarkContent;
        }
    }
}

并在 info.plist 中添加一个键:

<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>

参考:

iOS(白色状态栏,黑色文本)可以使用以下方法

    public void SetWhiteStatusBar()
    {
        Device.BeginInvokeOnMainThread(() =>
        {
            if (UIDevice.CurrentDevice.CheckSystemVersion(13, 0))
            {
                UIView statusBar = new UIView(UIApplication.SharedApplication.KeyWindow.WindowScene.StatusBarManager.StatusBarFrame);
                statusBar.BackgroundColor = UIColor.White;
                UIApplication.SharedApplication.KeyWindow.AddSubview(statusBar);
            }
            else
            {
                UIView statusBar = UIApplication.SharedApplication.ValueForKey(new NSString("statusBar")) as UIView;
                if (statusBar.RespondsToSelector(new ObjCRuntime.Selector("setBackgroundColor:")))
                {
                    statusBar.BackgroundColor = UIColor.White;
                }
            }
            UIApplication.SharedApplication.SetStatusBarStyle(UIStatusBarStyle.DarkContent, false);
            GetCurrentViewController().SetNeedsStatusBarAppearanceUpdate();
        });
    }

查看我的question/answer

完整的工作示例在这里https://github.com/georgemichailou/ShaXam