创建自定义导航栏渲染器在xamarin forms IOS项目中添加自定义后退按钮图标

时间:2021-06-08 15:44:53

标签: xamarin xamarin.forms xamarin.ios custom-renderer

我成功地在我的 Xamarin.Forms Android 项目中创建了一个自定义渲染器,以添加一个自定义后退按钮图标而不是本机后退按钮。我使用的渲染器如下:

public class MyNavigationPageRenderer: Xamarin.Forms.Platform.Android.AppCompat.NavigationPageRenderer
  {
    Context _context;

    AndroidX.AppCompat.Widget.Toolbar _toolbar;

    public MyNavigationPageRenderer(Context context) : base(context)
    {
      _context = context;
    }
    public override void OnViewAdded(Android.Views.View child)
    {
      base.OnViewAdded(child);
      if (child.GetType() == typeof(AndroidX.AppCompat.Widget.Toolbar))
      {
        _toolbar = (AndroidX.AppCompat.Widget.Toolbar)child;
        _toolbar.SetNavigationIcon(Resource.Drawable.Navigation_backbutton);
      }
    }

    protected override void OnLayout(bool changed, int l, int t, int r, int b)
    {
      base.OnLayout(changed, l, t, r, b);

      if (_toolbar != null)
      {
        if (_toolbar.NavigationIcon != null)
        {
          _toolbar.NavigationIcon = AndroidX.Core.Content.ContextCompat.GetDrawable(_context, Resource.Drawable.Navigation_backbutton);
        }
      }
    }
  }

在 Xamarin 中,由于我们需要为 Xamarin.IOS 项目使用单独的渲染器,因此我也需要在那里使用相同的逻辑。但是由于使用的库和类不同,我不确定如何进行。任何有关如何进行相同操作的帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

您可以尝试以下方法:

[assembly: ExportRenderer(typeof(NavigationPage), typeof(MyRenderer))]
namespace FormsApp.iOS
{
  class MyRenderer : NavigationRenderer
  {
    public override void ViewDidLayoutSubviews()
    {
        base.ViewDidLayoutSubviews();

      
        if (this.NavigationBar.TopItem.BackBarButtonItem == null)
        {
            this.NavigationBar.BackIndicatorImage = UIImage.FromFile("xx.png");
            this.NavigationBar.BackIndicatorTransitionMaskImage = UIImage.FromFile("xx.png");
            this.NavigationBar.TopItem.BackBarButtonItem = new UIBarButtonItem("", UIBarButtonItemStyle.Plain, null);
        }
    }

  }
}

here是Xamarin.iOS中自定义UINavigationBar的官方示例,可以参考。