Xamarin.Forms.Shell:如何管理StatusBar颜色
Xamarin.Forms.Shell: how to manage StatusBar color
我开发了一个小型 Xamarin.Forms.Shell 应用程序,但我没有找到如何应用 自定义颜色 StatusBar
前景和背景。
我的应用使用了非常基本的配色方案:
- black 用于
NavigationBar
的 Foreground 和 TabBar
- white 用于
NavigationBar
的 Background 和 TabBar
我想为StatusBar
保留相同的颜色,但事实并非如此:
- 在 iOS 上,
StatusBar
颜色似乎由 LightMode/[=51 管理=]深色模式
=> 在 不管理 DarkMode 的设备上,或者当 LightMode 处于活动状态时 ,StatusBar
信息是很好地展示
=> 但当 DarkMode 处于活动状态时情况并非如此,因为这些信息是隐藏的
- 在 Android 上,
StatusBar
颜色似乎由 styles.xaml
文件和 android:statusBarColor
属性
=> 如果我指定 white 颜色,则 StatusBar
信息不可见,因为还有白色
=> 而如果我指定 gray 颜色,则 StatusBar
信息清晰可见
所以我尝试应用给定的解决方案 :
- 这在 iOS 上不起作用:我仍然有相同的行为,因为
StatusBar
信息不可见,因为当 DarkMode 处于活动状态时也有白色
- 这似乎在 Android 上有效,但这并不涵盖所有 Android 版本(因为它适用于 Marshmallow 版本)
=> 我如何管理 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
我开发了一个小型 Xamarin.Forms.Shell 应用程序,但我没有找到如何应用 自定义颜色 StatusBar
前景和背景。
我的应用使用了非常基本的配色方案:
- black 用于
NavigationBar
的 Foreground 和TabBar
- white 用于
NavigationBar
的 Background 和TabBar
我想为StatusBar
保留相同的颜色,但事实并非如此:
- 在 iOS 上,
StatusBar
颜色似乎由 LightMode/[=51 管理=]深色模式
=> 在 不管理 DarkMode 的设备上,或者当 LightMode 处于活动状态时 ,StatusBar
信息是很好地展示
=> 但当 DarkMode 处于活动状态时情况并非如此,因为这些信息是隐藏的
- 在 Android 上,
StatusBar
颜色似乎由styles.xaml
文件和android:statusBarColor
属性
=> 如果我指定 white 颜色,则 StatusBar
信息不可见,因为还有白色
=> 而如果我指定 gray 颜色,则 StatusBar
信息清晰可见
所以我尝试应用给定的解决方案
- 这在 iOS 上不起作用:我仍然有相同的行为,因为
StatusBar
信息不可见,因为当 DarkMode 处于活动状态时也有白色 - 这似乎在 Android 上有效,但这并不涵盖所有 Android 版本(因为它适用于 Marshmallow 版本)
=> 我如何管理 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