У меня есть несколько цветных значков, которые отлично отображаются на Android, однако, когда я развертываю то же приложение на iOS, значки на панели инструментов становятся белыми (что определено в файле Styles.xaml), а значки в оттенках серого остаются прежними.
<Setter Property = "Shell.ForegroundColor" Value = "{OnPlatform WinUI = {StaticResource Primary}, Default = {StaticResource White}}" />
Обычные сероватые значки нормально отображаются на iOS, проблему вызывают только цветные.
Разве iOS не поддерживает цветные значки на панели инструментов?
Вот как это выглядит на Android, как правильный значок.
Я не хочу конвертировать свои значки в оттенки серого, чтобы они отображались правильно.
@LiqunShen-MSFT Я использую Shell Navigation. Я обновил свой вопрос. Я не хочу менять оттенок, а хочу, чтобы они отображались в виде значков правильного цвета (как показано на снимке экрана Android).
В iOS цвет оттенка ToolbarItems по умолчанию — белый. Если вы хотите изменить его, вы можете использовать MAUI Handler для изменения. Вот обходной путь (на основе статьи Владислава Антонюка и ответа @ColeX)
В папке Platform/iOS создайте новый файл с именем CustomShellHandler.cs.
В этом файле мы создадим новый класс CustomShellNavBarAppearanceTracker
и настроим/очистим оттенок значка. Я очищаю цвет оттенка как методом UpdateLayout
, так и SetAppearance
(для какого-то конкретного случая).
public class CustomShellHandler : ShellRenderer
{
protected override IShellNavBarAppearanceTracker CreateNavBarAppearanceTracker()
{
return new CustomShellNavBarAppearanceTracker(this, base.CreateNavBarAppearanceTracker());
}
}
class CustomShellNavBarAppearanceTracker : IShellNavBarAppearanceTracker
{
private readonly IShellContext shellContext;
private readonly IShellNavBarAppearanceTracker baseTracker;
public CustomShellNavBarAppearanceTracker(IShellContext shellContext, IShellNavBarAppearanceTracker baseTracker)
{
this.shellContext = shellContext;
this.baseTracker = baseTracker;
}
public void Dispose()
{
baseTracker.Dispose();
}
public void ResetAppearance(UINavigationController controller)
{
baseTracker.ResetAppearance(controller);
}
public void SetAppearance(UINavigationController controller, ShellAppearance appearance)
{
baseTracker.SetAppearance(controller, appearance);
var icons = controller.TopViewController.NavigationItem.RightBarButtonItems;
if (icons != null)
{
foreach (var icon in icons)
{
if (icon.Image != null)
{
icon.Image = icon.Image.ImageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal);
icon.TintColor = UIColor.Clear;
}
}
}
}
public void UpdateLayout(UINavigationController controller)
{
baseTracker.UpdateLayout(controller);
var icons = controller.TopViewController.NavigationItem.RightBarButtonItems;
if (icons != null)
{
foreach (var icon in icons)
{
if (icon.Image != null)
{
icon.Image = icon.Image.ImageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal);
icon.TintColor = UIColor.Clear;
}
}
}
}
public void SetHasShadow(UINavigationController controller, bool hasShadow)
{
baseTracker.SetHasShadow(controller, hasShadow);
}
}
Тогда не забудьте добавить Handler в файл MauiProgram.cs
,
#if IOS
builder.ConfigureMauiHandlers(handlers =>
{
handlers.AddHandler<Shell, CustomShellHandler>();
});
#endif
Вот результат,
Вы используете Shell или NavigationPage? Хотите изменить оттенок значка на iOS?