无法在 iOS 13 Visual Studio 中更改导航栏外观

Posted

技术标签:

【中文标题】无法在 iOS 13 Visual Studio 中更改导航栏外观【英文标题】:Can't Change Navigation Bar Appearance in iOS 13 Visual Studio 【发布时间】:2020-03-09 20:55:02 【问题描述】:

在我的 Xamarin.Forms 4.4 项目中,我使用以下代码将导航栏的全局颜色定义为带有白色文本的纯橙色::

UINavigationBar.Appearance.BackgroundColor = UIColor.Orange;
UINavigationBar.Appearance.BarTintColor = UIColor.Orange;
UINavigationBar.Appearance.TintColor = UIColor.White;
UINavigationBar.Appearance.TitleTextAttributes = new UIStringAttributes()

  ForegroundColor = UIColor.White
;

自从将我的 Xamarin.Forms NuGet 包从 4.4 升级到 4.5 后,我在 ios 13 中运行的任何应用程序在浅色模式下都有一个带有白色文本的纯白色导航栏。

我知道有一些新的类可用于 iOS 13。但是,我不明白如何使用这些类在 iOS 13 中获得相同的外观(或只是可读的东西)。这就是我所拥有的试过了:


  UINavigationBarApperance nba = new UINavigationBarAppearance();
  nba.ConfigureWithOpaqueBackground();
  nba.BackgroundColor = UIColor.Orange;
  nba.BarTintColor = UIColor.Orange;
  nba.TintColor = UIColor.White;
  UINavigationBar.Appearance.ScrollEdgeAppearance = nab;
  UINavigationBar.Appearance.StandardAppearance = nab;
  UINavigationBar.Appearance.CompactAppearance = nab;

这是我的结果:

我实际上可以看到一些颜色渗出似乎是白色渐变叠加层。我怀疑深灰色是我选择的颜色上的深色渐变的结果

【问题讨论】:

Xamarin 使用与原生 XCode 解决方案相同的 iOS API。另见github.com/xamarin/xamarin-macios/issues/6834 我刚刚在一个空白的 Forms iOS 应用程序中尝试了您的代码,并且成功了。但是,如果我在现有的表单应用程序中尝试使用表单代码自定义导航栏,则它不起作用。你确定你没有在表单代码中做任何会影响导航栏的事情吗? 您可以在 Xamarin.Forms 中分享一些关于 NavigationPageXaml 代码,这将有助于找到问题所在。 【参考方案1】:

我试过共享代码,在我的本地站点没有问题,在 Xamarin.iOSXamarin.Forms 项目中没有问题。效果如下:

使用共享代码需要写在AppDelegate.cs。如果写在其他地方,比如在Sub-ViewController,就不行了。

// application events from iOS.
[Register("AppDelegate")]
public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate

    //
    // This method is invoked when the application has loaded and is ready to run. In this 
    // method you should instantiate the window, load the UI into it and then make the window
    // visible.
    //
    // You have 17 seconds to return from this method, or iOS will terminate your application.
    //
    public override bool FinishedLaunching(UIApplication app, NSDictionary options)
    
        global::Xamarin.Forms.Forms.Init();
        global::Xamarin.Forms.FormsMaterial.Init();

        LoadApplication(new App());

        Console.WriteLine("------13--------");
        UINavigationBar.Appearance.BackgroundColor = UIColor.Orange;
        UINavigationBar.Appearance.BarTintColor = UIColor.Orange;
        UINavigationBar.Appearance.TintColor = UIColor.White;
        UINavigationBar.Appearance.TitleTextAttributes = new UIStringAttributes()
        
            ForegroundColor = UIColor.White
        ;

        return base.FinishedLaunching(app, options);
    

另外,从分享的截图来看,已经为 NavigationBar 设置了颜色。但是,它被其他颜色覆盖。我认为某些地方的代码编写会影响这一点。

顺便说一句,Xamarin Forms 有一些方法可以为导航栏设置颜色。您也可以使用它或检查是否已在项目中使用它。

App.xaml.cs

NavigationPage navigationPage = new NavigationPage(new MainPage());
navigationPage.BarBackgroundColor = Color.White;
navigationPage.BarTextColor = Color.Black;
MainPage = navigationPage;

【讨论】:

我发现该项目正在使用自定义 NavigationPage,它覆盖了我的全局导航栏设置。 @Pop-A-Stash 太好了!很高兴你找到了原因:-)

以上是关于无法在 iOS 13 Visual Studio 中更改导航栏外观的主要内容,如果未能解决你的问题,请参考以下文章

在 Visual Studio 2022 和 MAUI 中无法指定 iOS Bundle Signing 和 Provisioning

AppIcon 无法在 IOS 上使用 xamarin / Visual Studio Mac 显示,但可以使用 xcode

Xamarin iOS:无法对Visual Studio 2017中的控件设置约束

无法在Visual Studio中的Storyboard编辑器中添加图像,以便为Xamarin.iOS创建启动画面

Visual Studio 2015 for Cordova - 无法为 iOS 构建

Wcf 测试客户端如何在没有 Visual Studio 的情况下使用?